N替换if-else条件

NSubstitute if-else condition

美好的一天!我需要你的帮助,我有下一个测试:

    [SetUp]
    public void SetUp()
    {
        controller = Substitute.For<IApplicationController>();
        view = Substitute.For<ICamerasView>();
        presenter = new CamerasPresenter(controller, view);
        argument = InitializeDevicesList();
        presenter.Run(argument);
    }

    private List<string> InitializeDevicesList()
    {
        List<string> devicesList = new List<string>();
        Device device = new Device();

        devicesList.Add(device.Name);

        return devicesList;
    }

    [Test]
    public void RunIfDeviceListIsNotEmpty()
    {
        view.DidNotReceive().SetUIOnNoConnectedDevices();
        view.Received().FillCamerasListView(argument);
        view.Received().Show();

    }

实际测试下一个代码

    public override void Run(List<string> argument)
    {
        connectedCameras = argument;
        if(connectedCameras.Count == 0)
        {
            SetUIOnNoConnectedDevices();
        }
        else
        {
            FillCamerasListView();
        }
        View.Show();
    }

我的问题是 FillCamerasListView 方法没有在测试中调用。但正如预期的那样,在这种情况下它调用了 运行 方法。所以,我无法想象问题出在哪里,所以非常感谢您的帮助。感谢您的宝贵时间!

This example passes。问题似乎出在您的示例中,它正在更改传递给 FillCamerasListView 的参数,如评论中所讨论的那样。

几个选项:

  1. 修改代码以符合测试的预期。即将 Run 的参数传递给 FillCamerasListView.
  2. 使用 view.ReceivedWithAnyArgs().FillCamerasListView(null) 断言已进行调用,而无需担心所传递参数的具体细节。
  3. 使用view.Received().FillCamerasListView(Arg.Is<List<string>>(x => Matches(x, argument)),其中Matches是您自己的代码,它根据传递给Runargument判断给定的参数是否正确。