【问题标题】:Moq callback for ReturnsAsyncReturnsAsync 的起订量回调
【发布时间】:2015-10-29 07:55:44
【问题描述】:

我目前正在将 API 重构为异步操作,我需要重构异步测试。我有与Moq documentation类似的情况:

// returning different values on each invocation
var mock = new Mock<IFoo>();
var calls = 0;
mock.Setup(foo => foo.GetCountThing())
    .Returns(() => calls)
    .Callback(() => calls++);
// returns 0 on first invocation, 1 on the next, and so on
Console.WriteLine(mock.Object.GetCountThing());

我需要将其更改为:

// returning different values on each invocation
var mock = new Mock<IFoo>();
var calls = 0;
mock.Setup(foo => foo.GetCountThingAsync())
    .ReturnsAsync(calls)
    .Callback(() => calls++);
// returns 0 on first invocation, 1 on the next, and so on
Console.WriteLine(mock.Object.GetCountThingAsync());

但是由于ReturnAsync() 还不支持 lambda,因此调用了回调,但显然是在不同的上下文中,因此该变量仍然是下一次调用的值,而不是增加。有没有办法解决这个问题?

【问题讨论】:

    标签: c# asp.net-mvc unit-testing asynchronous moq


    【解决方案1】:

    在第一个示例中,您将 lambda 传递给 Returns 方法,并且每次调用模拟方法时都会重新评估该 lambda。正因为如此,你实际上可以结合CallbackReturns

    var mock = new Mock<IFoo>();
    var calls = 0;
    mock.Setup(foo => foo.GetCountThing())
        .Returns(() => calls++);
    
    Console.WriteLine(mock.Object.GetCountThing());
    

    在第二个示例中,您将值 0 传递给 ReturnsAsync 方法,这就是模拟每次都返回零的原因。虽然ReturnsAsync 不支持传递Func,但你仍然可以像这样使用Returns

    var mock = new Mock<IFoo>();
    var calls = 0;
    mock.Setup(foo => foo.GetCountThingAsync())
        .Returns(() => Task.FromResult(calls++));
    
    Console.WriteLine(await mock.Object.GetCountThingAsync());
    

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 2020-03-21
      • 2011-02-19
      相关资源
      最近更新 更多