2016-04-29 136 views
0

我有被嘲笑的類,但在某些情況下,我需要運行原來的方法起訂量爲callbase異步方法不起作用

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從異步方法移動到正常?

+0

是失敗'IDbContext'是一個類或接口? 'CallBase'將不能在接口上工作... –

+0

固定代碼示例,它是一個類 –

+0

爲什麼你想要調用原始方法?基本上'SaveChangesAsync'在新的'Task'中調用'SaveChanges',所以你可以使用真正的'DbContext'而不是假的'...還有一件事你如何驗證原始的'SaveChanges'沒有被調用? –

回答

0

嘿嘿與db.CallBase =真它的工作原理,但是當也有db.setup()。callbase()

0

我知道文檔說你可以做

db.CallBase =真

但我從來沒有使用的接近自己。這就是我如何部分地嘲笑一個班級,並且它運作良好。實際上

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