异步方法的Moq调用库不起作用

时间:2016-04-29 06:29:37

标签: c# unit-testing asynchronous callback moq

我有类被嘲笑但在某些情况下我需要运行原始方法

public virtual async Task<int> SaveChangesAsync(string userId)
{
    try
    {
        TrackChanges(userId);//sets some fields
        return await db.SaveChangesAsync();
    }
    catch (Exception e)
    {
        LogSaveValidationFailed(e);
        throw;
    }
}

我已尝试CallBase = true,但它不适用于async方法,也尝试使用CallBack进行解决方法......

var db = new Mock<DbContext>();
db.CallBase = true;
db.Setup(x => x.SaveChangesAsync(It.IsAny<string>())).ReturnsAsync(1).Callback((string user) =>
{
    db.Object.SaveChanges(user);
});

...它返回值芽从不调用回调。 一切都是正常的方法,但不能与异步一起工作。 我可以做些什么来使它与Moq一起使用,或者更好的只是重构一下并将TrackChanges从异步方法移动到正常?

2 个答案:

答案 0 :(得分:0)

我知道文档说你可以做到

  

db.CallBase = true

但我自己从未使用过这种方法。这就是我如何部分模拟一个类,它运作良好。

[TestClass]
public class MyClassTest
{
    [TestMethod]
    public async Task MyClass_ReturnsCorrectValues()
    {
        // Arrange
        var m = new Mock<MyClass>();
        m.Setup(x => x.IsKing())
            .Returns(Task.FromResult(true));
        m.Setup(x => x.IsQueen())
            .CallBase();

        // Act
        var isKing = await m.Object.IsKing();
        var isQueen = await m.Object.IsQueen();

        // Assert
        Assert.IsTrue(isKing); // true
        Assert.IsFalse(isQueen); // false
    }
}

public class MyClass
{
    public virtual async Task<bool> IsKing()
    {
        return await Task.FromResult(false);
    }

    public virtual async Task<bool> IsQueen()
    {
        return await Task.FromResult(false);
    }
}

答案 1 :(得分:0)

实际上,使用db.CallBase = true它可以工作,但是当它还有db.setup()时会失败.callbase()