[英]Moq callback for ReturnsAsync
我目前正在為異步操作重構API,我需要重構異步測試。 我有與Moq文檔中類似的情況:
// 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
方法,並且每次調用mocked方法時都會重新評估該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
方法,因此這就是每次模擬返回零的原因。 雖然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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.