使用 NSubstitute 对 ICommand 进行单元测试

Unit Testing ICommand with NSubstitute

我有以下 ViewModel

public class MyViewModel : IMyViewModel
{
    private readonly IMyModel myMode;
    private ICommand _myCommand;

    public MyViewModel(IMyModel model)
    {
        _model = model;
    }

    public ICommand MyCommand
    {
        get { return _myCommand ?? (_myCommand = new RelayCommand(x => MyMethod())); }
    }

    private void MyMethod()
    {
        _model.SomeModelMethod();
    }
}

IMyViewModel 定义为

public interface IMyViewModel
{
    ICommand MyCommand { get; }
} 

我的模型界面定义为

public interface IMyModel
{
    void SomeOtherCommand();
} 

现在在我的单元测试中(使用 NSubstitute)我想检查当调用 MyCommand 时我的模型接收到对其方法的调用 SomeModelMethod。我试过:

[TestMethod]
public void MyViewModel_OnMyCommand_CallsSomeOtherMethodOnModel()
{
   var model = Substitute.For<IMyModel>();
   var viewModel = Substitute.For<IMyViewModel>();

   viewModel.MyCommand.Execute(null);

   model.Received().SomeOtherMethod();
}

但这目前不起作用。当我的 ViewModel 上的命令被调用时,如何最好地测试我的 Model 方法是否被调用?

不知道你为什么要在这里嘲笑 IMyViewModel。你说你想测试在MyViewModel.

中执行命令时是否调用了SomeOtherMethod

你不应该在这里嘲笑 MyViewModel

[TestMethod]
public void MyViewModel_OnMyCommand_CallsSomeOtherMethodOnModel()
{
   var model = Substitute.For<IMyModel>();
   var viewModel = new MyViewModel(model);

   viewModel.MyCommand.Execute(null);

   model.Received().SomeOtherMethod();
}

P.S:我对nsubstitute不熟悉。但是这个想法仍然是一样的(你不应该嘲笑 MyViewModel)。确保您在 nsubstitute 中使用了正确的方法。