簡體   English   中英

NSubstitute 模擬一個沒有參數的方法以進行多次調用

[英]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 方法中將起作用。 雖然不知道為什么...

使用outref參數時,參數匹配可能會有些棘手,因為最初指定調用時使用的值會在測試執行期間發生變化。

解決此問題的最可靠方法是使用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.

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