Rhino Mocks: значение заглушки используется в утверждении? - PullRequest
5 голосов
/ 19 мая 2011

Сначала мой вопрос, а затем некоторые детали:

Q: Нужно ли вводить в тупик значение свойства, когда оно используется в последующем присваивании?

Подробности:
Я использую синтаксис AAA Rhino Mocks 3.5 в классах MSpec.Я обрезал код ниже, чтобы его было (надеюсь) легко обмануть.

* Значение свойства Not Stubbing _fooResultMock: *

[Subject("Foo")]
public class when_foo {
    Establish context = () => {
        _fooDependencyMock.Stub(x => x.GetResult()).Return(_fooResultMock);
        _foo = new Foo(_fooDependencyMock);
    };

    Because action = () => {
        _foo.Whatever();
    };

    It should_set_the_name_field = () => {
        _fooTargetMock.AssertWasCalled(x => x.Name = _fooResultMock.Name);
    };
}

* Значение свойства _fooResultMock Stubbing: *

[Subject("Foo")]
public class when_foo {
    Establish context = () => {
        _fooDependencyMock.Stub(x => x.GetResult()).Return(_fooResultMock);
        _fooResultMock.Stub(x => x.Name).Return(_theName); // _theName!
        _foo = new Foo(_fooDependencyMock);
    };

    Because action = () => {
        _foo.Whatever();
    };

    It should_set_the_name_field = () => {
        _fooTargetMock.AssertWasCalled(x => x.Name = _theName); // _theName!
    };
}

Важным для моего теста является то, что значение, найденное в свойстве _fooResultMock Name, присваивается свойству _fooTargetMock.

Таким образом, первый блок кода адекватно проверяет это или является вторым кодомблок (который выставляет значение свойства Name _fooResultMock) необходим?

Является ли второй блок нежелательным по какой-либо причине?

1 Ответ

1 голос
/ 20 мая 2011

Несколько вопросов, которые укажут правильный ответ:

  • Является ли _fooResultMock PartialMock конкретного класса? Если это так, то, если вы не заглушите Name, вы получите значение свойства Name реального класса. Если _fooResultMock НЕ является PartialMock и вы не заглушите его, вы получите значение по умолчанию для типа Name (возможно, null).

  • Что такое _fooTargetMock? Это не указано нигде в этом тесте. Это должно быть _foo вместо этого?

Я предполагаю, что макет результатов не является частичным; основной случай частичных имитаций - это изоляция некоторых методов одного класса от других в том же классе (например, насмешка над методом записи в файл, чтобы можно было проверить метод вычисления, вызывающий метод записи в файл). В этом случае первый блок кода в основном сравнивает ноль с нулем, независимо от того, получил ли целевой макет свое поле «Имя» из макета результатов или нет. Итак, второй кодовый блок является лучшим тестом того, произошло ли присвоение.

...