С помощью Rhino Mocks почему вызов макета для свойства во время инициализации теста возвращает ожидаемый вызов № 1, фактический вызов № 0? - PullRequest
1 голос
/ 07 апреля 2009

В настоящее время у меня есть тест, который проверяет докладчик, который у меня есть в модели MVP. У моего докладчика есть свойство, которое будет вызывать мой вид, который в моём тесте макетируется. В Инициализации моего теста, после того, как я установил свой Просмотр на Presenter как смоделированный Просмотр, я установил свое свойство на Presenter, которое будет вызывать этот метод.

В моем тесте у меня нет Expect.Call для метода, который я вызываю, но когда я запускаю, я получаю это ложное исключение Rhino:

Rhino.Mocks.Exceptions.ExpectationViolationException: IView.MethodToInvoke (); Ожидаемый # 1, фактический # 0 ..

Из того, что я понимаю с насмешками Rhino, до тех пор, пока я вызываю Mock за пределами ожидаемого блока, это не должно записывать это. Я хотел бы представить, чтобы испытание прошло. Есть ли причина, по которой он не проходит?

Ниже приведен код, показывающий мои настройки.

public class Presenter
{
    public IView View;

    public Presenter(IView view)
    {
        View = view
    }
    private int _property;
    public int Property
    get { return _property;}
    set
    {
       _property = value;

       View.MethodToInvoke();
    }
}

... Тестовый код ниже ...

[TestInitialize]
        public void Initilize()
        {
            _mocks = new MockRepository();
            _view = _mocks.StrictMock<IView>();
            _presenter = new Presenter(_view);
            _presenter.Property = 1;            
        }
[TestMethod]
        public void Test()
        {
            Rhino.Mocks.With.Mocks(_mocks).Expecting(delegate
            {                
            }).Verify(delegate
            {
                _presenter.SomeOtherMethod();
});
        }

Ответы [ 3 ]

1 голос
/ 05 июня 2009

С какой стати вы захотите проверять одно и то же каждый раз при запуске теста?

Если вы хотите проверить, что происходит определенная вещь, вы должны проверить это в одном тесте.

Шаблон, который вы используете сейчас, подразумевает, что вам нужно - установить предпосылки для тестирования - сделать поведение - проверьте правильность поведения а затем повторите это несколько раз в одном тесте

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

Здесь есть несколько вещей, которые нужно обсудить, но было бы яснее, если бы вы сделали что-то вроде:

[TestMethod]
ShouldCallInvokedMethodWhenSettingProperty()
{
   var viewMock = MockRepository.GenerateMock<IView>()

   var presenter = new Presenter(viewMock);

   presenter.Property = 1;

   viewMock.AssertWasCalled(view => view.InvokedMethod());

}

Подробнее о синтаксисе Rhino Mocks 3.5 читайте здесь: http://ayende.com/Wiki/Rhino+Mocks+3.5.ashx

0 голосов
/ 08 апреля 2009

Проблема заключалась в том, что я не понимал записи / проверки, что происходит со строгими издевательствами. Для того, чтобы исправить эту проблему, я изменил свою функцию TestInitilize. По сути, это быстрый тест моего начального состояния, которое я настраиваю для всех своих тестов.

[TestInitialize]
    public void Initilize()
    {
        _mocks = new MockRepository();
        _view = _mocks.StrictMock<IView>();
        _presenter = new Presenter(_view);

        Expect.Call(delegate { _presenter.View.InvokedMethod(); });
        _mocks.ReplayAll();
        _mocks.VerifyAll();
        _mocks.BackToRecordAll();
        _presenter.Property = 1;
    }
0 голосов
/ 07 апреля 2009
  1. Что именно вы пытаетесь проверить в методе Test?
  2. Вам следует избегать строгих издевательств.
  3. Я предлагаю использовать синтаксис AAA Rhino (Arrange, Act, Assert) .
...