Я немного смущен тем, что здесь происходит. Я смотрю на пример головоломки из Atomic Object, показывающий, как протестировать модель Model-View-Presenter Puzzle.zip
Просмотр имеет частное мероприятие. Представление также имеет функцию подписки (делегата), которая добавляет делегата к событию. Ведущий передается в IView и IModel. Во время построения он подписывается на представление и подключает его к функции на модели.
Для модульного тестирования Presenter класс View смоделирован с помощью NMock. Так что это просто тупой класс, и функция Subscribe () на самом деле ничего не делает. Конечно, чтобы протестировать докладчика, вы должны смоделировать представление и модель, затем вызвать событие в представлении и убедиться, что функция модели была вызвана. Пример кода работает просто отлично - однако я не понимаю, как это работает !!
Некоторые выдержки:
private DynamicMock modelMock;
private IPuzzleModel model;
private DynamicMock viewMock;
private IPuzzleView view;
private SavedTypeOf moveRequestConstraint;
[SetUp]
public void SetUp()
{
modelMock = new DynamicMock(typeof(IPuzzleModel));
modelMock.Strict = true;
model = modelMock.MockInstance as IPuzzleModel;
// Setup the view
viewMock = new DynamicMock(typeof(IPuzzleView));
viewMock.Strict = true;
view = viewMock.MockInstance as IPuzzleView;
moveRequestConstraint = new SavedTypeOf(typeof(PointDelegate));
viewMock.Expect("SubscribeMoveRequest", moveRequestConstraint);
// create the presenter
new PuzzlePresenter(model, view);
}
[Test]
public void test_MoveRequest_fromView()
{
Point point = new Point(1, 2);
modelMock.Expect("MoveRequest", point);
PointDelegate trigger = moveRequestConstraint.GetInstance as PointDelegate;
trigger(point);
}
Каким-то образом вызов «триггер (точка)» фактически связан с представлением и вызывает срабатывание частного события в представлении. Я не могу понять, как это работает - я не вижу, где это связано с экземпляром представления. Чего мне не хватает?
Обновление: Я пытаюсь использовать NMock 2. Похоже, что переменная moveRequestConstraint получает значение, которое передается в SubscribeMoveRequest () в функции TestSetup. Однако это синтаксис NMock 1, а NMock 2 не поддерживает этот синтаксис. Как бы я сделал это с NMock 2?