【问题标题】:Moq callbase for async methods don't work异步方法的最小起订量调用库不起作用
【发布时间】:2016-08-24 04:25:42
【问题描述】:

我有一个模拟的类,但在某些情况下我需要运行原始方法

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 从异步方法移动到正常方法?

【问题讨论】:

  • IDbContext是类还是接口? CallBase 在接口上不起作用...
  • 固定代码示例,它是一个类
  • 为什么要调用原始方法?基本上SaveChangesAsync 在一个新的Task 中调用SaveChanges,所以你可以使用真正的DbContext 而不是假的......还有一件事你如何验证原来的SaveChanges 没有被调用?
  • 您能解释一下“某些情况下我需要运行原始方法”吗?看起来您正在结合单元测试和集成测试。
  • 是的,我这样做,模拟所有外部部件,但我想从头到尾运行我的所有代码,

标签: c# unit-testing asynchronous callback moq


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我知道文档说你可以做到

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

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      相关资源
      最近更新 更多