簡體   English   中英

ReturnAsync的Moq回調

[英]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。 因此,您實際上可以組合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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM