Как утверждать, что действие было названо - PullRequest
3 голосов
/ 20 июня 2011

Мне нужно активировать действие, вызываемое фиктивным компонентом.

 public interface IDispatcher
    {
     void Invoke(Action action);
    }

    public interface IDialogService
    {
      void Prompt(string message);
    }

    public class MyClass
    {
    private readonly IDispatcher dispatcher;
    private readonly IDialogservice dialogService;
    public MyClass(IDispatcher dispatcher, IDialogService dialogService)
    {
     this.dispatcher = dispatcher;
    this.dialogService = dialogService;
    }

    public void PromptOnUiThread(string message)
    {
     dispatcher.Invoke(()=>dialogService.Prompt(message));
    }
    }

    ..and in my test..

   [TestFixture]
    public class Test
    {
     private IDispatcher mockDispatcher;
     private IDialogService mockDialogService;
    [Setup]
    public void Setup()
    {
     mockDispatcher = MockRepository.GenerateMock<IDispatcher>();
     mockDialogService = MockRepository.GenerateMock<IDialogService>();
    }

    [Test]
    public void Mytest()
    {
     var sut = CreateSut();
    sut.Prompt("message");

    //Need to assert that mockdispatcher.Invoke was called
    //Need to assert that mockDialogService.Prompt("message") was called.
    }
     public MyClass CreateSut()
    {
      return new MyClass(mockDipatcher,mockDialogService);
    }
    }

Может быть, мне нужно реструктурировать код, но запутался в этом.Не могли бы вы посоветовать, пожалуйста?

Ответы [ 2 ]

7 голосов
/ 20 июня 2011

Вы на самом деле тестируете эту строку кода:

dispatcher.Invoke(() => dialogService.Prompt(message));

Ваш класс вызывает макет, чтобы вызвать метод другого макета. Обычно это просто, вам просто нужно убедиться, что Invoke вызывается с правильными аргументами. К сожалению, аргумент является лямбда и не так легко оценить. Но, к счастью, это вызов макета, который снова облегчает: просто позвоните и убедитесь, что другой макет был вызван:

Action givenAction = null;
mockDipatcher
  .AssertWasCalled(x => x.Invoke(Arg<Action>.Is.Anything))
  // get the argument passed. There are other solutions to achive the same
  .WhenCalled(call => givenAction = (Action)call.Arguments[0]);

// evaluate if the given action is a call to the mocked DialogService   
// by calling it and verify that the mock had been called:
givenAction.Invoke();
mockDialogService.AssertWasCalled(x => x.Prompt(message));
3 голосов
/ 20 июня 2011

Вы должны сначала поставить ожидание на свой макет. Например, я хочу проверить, что Invoke вызывается только один раз, и мне наплевать на входящие параметры.

mockDispatcher.Expect(m => m.Invoke(null)).IgnoreArguments().Repeat.Once();

Тогда вы должны утверждать и проверять свои ожидания

mockDispatcher.VerifyAllExpectations();

вы можете сделать то же самое для второго макета, однако не рекомендуется использовать два макета на тестовый модуль. Вы должны проверить каждый в разных тестах.

Для установки ожиданий, пожалуйста, прочитайте http://ayende.com/wiki/Rhino+Mocks+Documentation.ashx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...