c# - ReturnsAsync 的最小起订量回调

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

我目前正在将 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,回调被调用,但显然是在不同的上下文中,因此变量仍然是下一次调用的值,而不是增加。有办法解决这个问题吗?

最佳答案

在第一个示例中,您将一个 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());

关于c# - ReturnsAsync 的最小起订量回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31851164/

相关文章:

c# - 在 PushSharp 4.0 中构建 GCM 消息

javascript - 如何使用 html.beginform 从服务器端获取结果?

c# - 模拟单元测试在 AsNoTracking() 上返回 ArgumentNullException

c# - 我可以 PInvoke C++ 可执行文件但不能共享库

c# - Entity Framework 和自引用表

c# - 如何解决在 Asp.NET 中找不到指定模块的错误?

javascript - 在 asp.net mvc 中使用 angularjs 进行多重布局

javascript - Mocha js 调用 After() 太快了吗?

java - maven-surefire-plugin 失败并出现错误 "Cannot load 32-bit SWT libraries on 64-bit JVM"

时间:2019-05-17 标签:c#mysqlconnecterror