我如何模拟AddAsync?

问题描述 投票:3回答:1

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

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,例外

回调无效。使用参数设置方法(WebJobStatus,CancellationToken)无法使用参数调用回调(WebJobStatus)。

任何人有任何想法?

c# unit-testing entity-framework-core moq xunit
1个回答
4
投票

您将需要返回一个Task以允许async / await调用

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也需要预期两个参数。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.