«Я пытаюсь проверить, что изменение исходного текстового поля приводит к изменению копии текстового поля.»
Вот как вы должны настроить тест:
- Скажите, вид макет, чтобы поднять
Changed
событие
- Скажите макету представления, чтобы возвратить
"Testing ..."
при вызове get_Original
свойства get
- Сообщите, что вы ожидаете вызова для
Copy
установщика со значением "Testing ..."
- Проверка ложных ожиданий
Я не уверен, возможно ли повышение событий с помощью NUnit.Mocks. Судя по довольно крошечному API, я бы сказал нет. Тем не менее, вы можете обойти эту проблему, вызвав обработчик событий напрямую (так как он в любом случае открыт):
viewMock.ExpectAndReturn("get_Original", "Testing ...");
viewMock.Expect("set_Copy", "Testing ...");
presenter.OnChanged(viewMock, EventArgs.Empty);
// here we verify expectations set on mock object;
// that Copy setter was called with "Testing ..." value
viewMock.Verify();
Вы можете увидеть, что этот тест действительно работает, просто изменив set_Copy
ожидаемое значение на что-то другое, чем "Testing ..."
- он не пройдёт с соответствующим сообщением.
Пересмешные рамки sidenote
Есть ли причина, по которой вы используете NUnit.Mocks вместо более серьезных фреймворков? Дайте FakeItEasy , Moq или RhinoMocks взгляд.
Вот как ваш тест мог бы выглядеть, если бы вы использовали вместо этого FakeItEasy:
[Test]
public void WhenViewChangedEventIsRaised_PresenterSetsCopyProperty()
{
var viewMock = A.Fake<IView>();
var presenter = new Presenter(viewMock);
A.CallTo(() => viewMock.Original).Returns("Testing ...");
viewMock.Changed += Raise.With(EventArgs.Empty).Now;
Assert.AreEqual(viewMock.Copy, "Testing ...");
}
Обратите внимание, что такие проблемы, как набор Cpoy
вместо Copy
, сразу исчезают. Не говоря уже о том, что вам не нужно будет показывать обработчики событий в общедоступном API.