簡體   English   中英

異步方法的Moq呼叫基不起作用

[英]Moq callbase for async methods don't work

我有被嘲笑的類,但在某些情況下,我需要運行原始方法

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

...它返回值bud永遠不會調用回調。 一切工作正常的方法,但不適用於異步。 我該怎么做才能使其與Moq一起使用,還是最好重構一下並將TrackChanges從async方法移到普通方法?

我知道文檔說你可以做

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

呵呵,實際上與db.CallBase = true一起工作,但是當還有db.setup()。callbase()時失敗

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM