Estoy escribiendo prueba de unidad. Para probar el método de abajo,
public async Task<Guid> CreateWebJobStatus(string blobId, Guid loggedInUserId, string loggedInUserEmail) {
Guid webJobStatusId = Guid.NewGuid();
WebJobStatus newWebJobStatus = new WebJobStatus
{
WorkJobStatusId = webJobStatusId,
TransactionId = Guid.NewGuid(),
Status = (int)WebJobStatusEnum.PENDING,
BlobId = blobId,
UserId = loggedInUserId,
UserEmail = loggedInUserEmail,
};
await _dbContext.WebJobStatus.AddAsync(newWebJobStatus);
await _dbContext.SaveChangesAsync();
return webJobStatusId;
}
Me burlé de dbset y dbcontext
public async void CreateWebJobStatusTest() {
var dbOption = new DbContextOptions<TimeSeriesDbContext>();
var mockDbContext = new Mock<TimeSeriesDbContext>(dbOption);
var mockConfig = new Mock<IConfiguration>();
var instance = new WebJobStatusRepository(mockConfig.Object, mockDbContext.Object);
var mockValidWebJobId = "11111111-1111-1111-1111-111111111111";
var webjobStatusList = new List<WebJobStatus>() {
new WebJobStatus {
WorkJobStatusId = Guid.Parse(mockValidWebJobId),
GroupName = "testGroupName",
Status = 3,
CreatedDate = DateTimeOffset.UtcNow.AddDays(-10)
}
};
var mockWebJobDbSet = UnitTestUtil.CreateDbSetMock<WebJobStatus>(webjobStatusList.AsQueryable());
mockDbContext.Setup(x => x.WebJobStatus).Returns(mockWebJobDbSet.Object);
mockWebJobDbSet.Setup(x => x.AddAsync(It.IsAny<WebJobStatus>(), It.IsAny<System.Threading.CancellationToken>())).Callback((WebJobStatus wj) =>{webjobstatusList.add(wj);});
var mockuserId = Guid.Parse("22222222-1111-1111-1111-111111111111");
var result = await instance.CreateWebJobStatus("testBlobId.tsv", mockuserId, "testEmail");
Assert.IsType<Guid>(result);
mockDbContext.Verify(x => x.SaveChangesAsync(It.IsAny<System.Threading.CancellationToken>()), Times.Once);
mockWebJobDbSet.Verify(x => x.AddAsync(It.IsAny<WebJobStatus>(), It.IsAny<System.Threading.CancellationToken>()), Times.Once);
}
todo funciona como es de esperar, excepto el AddAsync
, la excepción es
Devolución de llamada no válida. La configuración en el método con parámetros (WebJobStatus, CancelaciónToken) no puede invocar la devolución de llamada con parámetros (WebJobStatus).
Alguien tiene alguna idea?
Deberá devolver una tarea para permitir la llamada asíncrona / espera
await _dbContext.WebJobStatus.AddAsync(newWebJobStatus);
para fluir hasta su finalización.
Asumiendo que Agregar devuelve el objeto agregado
mockWebJobDbSet
.Setup(_ => _.AddAsync(It.IsAny<WebJobStatus>(), It.IsAny<System.Threading.CancellationToken>()))
.Callback((WebJobStatus model, CancellationToken token) => { webjobstatusList.Add(model); })
.Returns((WebJobStatus model, CancellationToken token) => Task.FromResult((EntityEntry<WebJobStatus>)null));
Tenga en cuenta que el método de Setup
toma dos argumentos, por lo que la Returns
Callback
y las Returns
deberán esperar dos argumentos también si desean usar los argumentos capturados.