2015-04-27 2 views
0

У меня есть следующие ViewModelМодульное тестирование ICommand с NSubstitute

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 моя модель получает звонок на свой счет hod SomeModelMethod. Я пробовал:

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

    viewModel.MyCommand.Execute(null); 

    model.Received().SomeOtherMethod(); 
} 

, но это не работает. Как лучше всего проверить, вызван ли мой метод Model, когда вызывается команда в моей модели ViewModel?

+0

Вместо того, чтобы создавать подменю для viewModel, вам, вероятно, захочется сделать «новый viewModel (model.object)» или что-то другое, что эквивалентно замене. Вы не хотите издеваться над объектом, который вы на самом деле тестируете. – forsvarir

ответ

2

Не знаете, почему вы насмешливо IMyViewModel здесь. Вы сказали, что хотите проверить, вызывается ли SomeOtherMethod при выполнении команды в MyViewModel.

Вы не должны насмехаться над 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.

+0

Спасибо, но Visual Studio теперь кричит, что ожидает метод, делегат или событие при попытке вызвать 'viewModel.MyCommand (null)'. Я все еще не понимаю, как правильно вызвать ICommand. Какие-либо предложения? –

+0

D'oh. Он должен читать 'viewModel.MyCommand.Execute (null)' Спасибо –

+0

@JamesB Ha, я скопировал ваш код и сделал такую ​​же опечатку :) Рад, что вы его решили. –