[英]NSubstitute mock a method with out parameter for multiple calls
我試圖模擬一個沒有參數的方法,並在單元測試中多次調用它。 這是我的主要代碼:
foreach (Device device in deviceList)
{
ResponseCode response = this.client.GetState(device.Name, out State state);
DeviceStatus deviceStatus = new DeviceStatus
{
Device = device,
ResponseCode = response,
State = state
}
}
以下是我在測試中所做的:
IClient mockClient;
var deviceList = new List<Device>
{
new Device { Name = "device1" },
new Device { Name = "device2" },
new Device { Name = "device3" }
}
this.mockClient.GetState(Arg.Is<string>(x => x == "device1"), out State device1State).
Returns(x =>
{
x[1] = preSetStateForDevice1;
return ResponseCode.Success;
});
this.mockClient.GetState(Arg.Is<string>(x => x == "device2"), out State device2State).
Returns(x =>
{
x[1] = preSetStateForDevice2;
return ResponseCode.Success;
});
this.mockClient.GetState(Arg.Is<string>(x => x == "device3"), out State device3State).
Returns(x =>
{
x[1] = preSetStateForDevice3;
return ResponseCode.Success;
});
在調試中,我發現所有三個 GetState 調用都返回與第一次調用相同的結果。 我知道有沒有 out 參數的多次返回的帖子或沒有 out 參數的單個調用方法的帖子,但我不知道如何使這個沒有 out 參數的方法的多次調用有效,請幫助。 謝謝!
更新:我還嘗試通過調用序列而不是輸入值來設置和返回,如下所示:
this.mockClient.GetState(Arg.Any<string>(), out State state).
Returns(x =>
{
x[1] = preSetStateForDevice1;
return ResponseCode.Success;
},
x =>
{
x[1] = preSetStateForDevice2;
return ResponseCode.Success;
},
x =>
{
x[1] = preSetStateForDevice3;
return ResponseCode.Success;
});
它也沒有工作
更新:從這篇文章中找到了一種方法: NSubstitute, out Parameters and conditional Returns use ReturnsForAnyArgs 而不是 Returns 在第二個 try 方法中將起作用。 雖然不知道為什么...
使用out
和ref
參數時,參數匹配可能會有些棘手,因為最初指定調用時使用的值會在測試執行期間發生變化。
解決此問題的最可靠方法是使用Arg.Any
匹配out
參數。 例如:
mockClient
.GetState(Arg.Is<string>(x => x == "device1"), out Arg.Any<State>())
.Returns(...)
有關為什么這是一個問題的更多信息,請參閱設置和ref
arguments:分配out
匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.