gpt4 book ai didi

c# - 我如何模拟 AddAsync?

转载 作者:行者123 更新时间:2023-11-30 14:46:22 25 4
gpt4 key购买 nike

我正在编写单元测试。为了测试下面的方法,

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;
}

我模拟了 dbset 和 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);
}

除了 AddAsync 之外,一切都按预期工作,异常(exception)是

Invalid callback. Setup on method with parameters (WebJobStatus,CancellationToken) cannot invoke callback with parameters (WebJobStatus).

有人知道吗?

最佳答案

您需要返回一个任务以允许异步/等待调用

await _dbContext.WebJobStatus.AddAsync(newWebJobStatus);

流向完成。

所以假设 Add 返回添加的对象

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));

请注意,Setup 方法有两个参数,因此 CallbackReturns 也需要两个参数(如果需要)使用捕获的参数。

关于c# - 我如何模拟 AddAsync?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49142556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com