我如何模拟 AddAsync? [英] How do I mock AddAsync?

查看:15
本文介绍了我如何模拟 AddAsync?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm writing unit test. For testing the method below,

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

I mocked dbset and 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之外,一切都按预期工作,例外是

everything works as expect except the AddAsync, the exception is

无效的回调.带参数的方法设置(WebJobStatus,CancellationToken)不能调用带参数的回调(WebJobStatus).

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

有人知道吗?

推荐答案

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

You will need to return a Task to allow the async/await call

await _dbContext.WebJobStatus.AddAsync(newWebJobStatus);

流到完成.

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

So assuming that Add returns the object added

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 也需要两个参数(如果需要)使用捕获的参数.

Note that the method being Setup takes two arguments, so the Callback and Returns will need to expect two arguments as well if they want to use the captured arguments.

这篇关于我如何模拟 AddAsync?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆