MVP с Moq - загрузка макета - PullRequest
       25

MVP с Moq - загрузка макета

0 голосов
/ 11 февраля 2011

Я много читал о издевательстве / окурке / фальсификации - и все еще сталкиваюсь с моими умственными препятствиями.

Я пытаюсь адаптировать MVP (Model View Presenter) с "забавной" системой отслеживания потери весаЯ строю для себя самого Жирного МакФаттера.Я пытаюсь использовать TDD & 'by the book', но попадаю во многие ментальные блоки и замираю.

Я создаю своего Presenter и высмеиваю мой Service & View в данный момент.Вот мой тест: еще раз обратите внимание: сервис и представление смоделированы с Moq

[Test]
    public void GetLog_WithExistingDate_ViewSetWithExistingLog()
    {
        WeightLogModel model = new WeightLogModel
                                   {
                                       EntryDate = DateTime.Now,
                                       Waist = 42,
                                       Weight = 242
                                   };

        service.Setup(x => x.GetLog(It.IsAny<DateTime>())).Returns(model);

        presenter.Display(DateTime.Now);

        IWeightLogView myView = view.Object;
        Assert.AreEqual(model.Weight, myView.Weight);

    }

и в моем Presenter - это мой метод отображения:

public void Display(DateTime date)
    {
        var weightLog = service.GetLog(date);
        if(weightLog == null) return;

        View.EntryDate = weightLog.EntryDate;
        View.Waist = weightLog.Waist;
        View.Weight = weightLog.Weight;
    }

Сейчас - если я отлаживаю как Displayвызывается - я вижу, что weightLog заполнен правильной информацией, которую я настроил в макете.Но поскольку предполагается установить View.EntryDate, View.Waist и т. Д., Значения View никогда не меняются.Они остаются равными нулю или 0001/1/1

Есть ли способ заставить это работать?Или это просто плохой тест и я запутываюсь в замешательстве?

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Спасибо Филу за то, что запустили меня в движение. Хотя я не хотел явно устанавливать то, что собирался вернуть - я хотел, чтобы макет вел себя так же, как мой. Вы можете заставить смоделированный установщик вести себя как обычно, вызвав SetupProperty -> view.SetupProperty (x => x.Weight) // в моем случае ... вот тест, который теперь пройдет, утверждая, что вес установлен

[Test]
    public void GetLog_WithExistingDate_ViewSetWithExistingLog()
    {
        WeightLogModel model = new WeightLogModel
                                   {
                                       EntryDate = DateTime.Now,
                                       Waist = 42,
                                       Weight = 242
                                   };

        service.Setup(x => x.GetLog(It.IsAny<DateTime>())).Returns(model);
        // I ADDED THIS ONE LINE
        view.SetupProperty(x => x.Weight);

        presenter.Display(DateTime.Now);

        IWeightLogView myView = view.Object;
        Assert.AreEqual(model.Weight, myView.Weight);

    }
1 голос
/ 11 февраля 2011

Вы не показываете здесь весь свой установочный код и зависимости между классами.

Однако, если вы действительно издеваетесь над представлением, называемым «myView», оно будет возвращать то, что у вас настроено, чтобы возвращать макет, или значения по умолчанию для каждого типа, если вы ничего не указали для его возврата (что звучит как что происходит).

Из вашего комментария:

Я пытаюсь настроить service.GetLog (дата), чтобы вернуть WeightLogModel у меня в тесте. мой думая, что делая это - сделает что WeightLogModel доступен в моем ведущий

Пока кажется, что это работает из вашего первоначального вопроса.

, чтобы назначить на мой смоделированный вид - где View.EntryDate = weightLog.EntryDate .... в этом случае weightLog это то, что настройка в тесте .... надеюсь у меня все ясно где моя голова ... я не говоря, что я прав - это то, что мой хотя мышление.

Где вы идете не так, там, где вы говорите «назначить на мой издевательский взгляд». Из вашего кода не ясно, является ли свойство View фактически вашим смоделированным представлением (потому что ваш код неполон).

Хотя в данном случае это на самом деле не имеет значения . Если свойство View на самом деле является имитацией, оно будет возвращать только то, что вы говорите, чтобы оно возвращалось - его свойства не будут вести себя как "нормальные" свойства.

Таким образом, следующее не будет выполнено без явной настройки:

mockView.MyProperty = "hello";
Assert.AreEqual("hello", mock.MyProperty);
...