ReturnsAsync 的最小起订量回调
Moq callback for ReturnsAsync
我目前正在重构 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。因此,您实际上可以组合 Callback
和 Returns
var mock = new Mock<IFoo>();
var calls = 0;
mock.Setup(foo => foo.GetCountThing())
.Returns(() => calls++);
Console.WriteLine(mock.Object.GetCountThing());
在第二个示例中,您将值 0 传递给 ReturnsAsync
方法,这就是每次模拟 returns 零的原因。虽然 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());
我目前正在重构 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。因此,您实际上可以组合 Callback
和 Returns
var mock = new Mock<IFoo>();
var calls = 0;
mock.Setup(foo => foo.GetCountThing())
.Returns(() => calls++);
Console.WriteLine(mock.Object.GetCountThing());
在第二个示例中,您将值 0 传递给 ReturnsAsync
方法,这就是每次模拟 returns 零的原因。虽然 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());