Moq с шаблоном WinForms MVP - провальный тест - PullRequest
2 голосов
/ 07 августа 2009

Я изучаю TDD и шаблон MVP. Я создал простое приложение WinForms, которое заменяет инструмент TOAD SQL. Я пытаюсь вернуться и написать тесты для кода, который я уже написал (который, как я знаю, не является правильным процессом для TDD, но, пожалуйста, потерпите меня).

В моем тестовом классе для формы я хочу протестировать конкретный Presenter, но макетируйте WinForm, так как у докладчика есть реальная логика, которая должна быть проверена. Однако, когда я высмеиваю вид с помощью Moq, я не вижу ожидаемых результатов. В приведенном ниже коде первые 2 тестируют PASS, но 3-й отказ на первом Assert.

Когда я присоединяю отладчик к NUnit и запускаю, свойство Environment не устанавливается в Environments.Test, когда вызывается presenter.IsDangerousSQL:

private Mock<IQueryForm> mockWindow;
private QueryFormPresenter presenter;

/// <summary>
/// Runs ONCE prior to any tests running
/// </summary>
[TestFixtureSetUp]
public void TestFixtureSetUp()
{
    //We're interested in testing the QueryFormPresenter class here, but we 
    //don't really care about the QueryForm window (view) since there is hardly any code in it.
    //Therefore, we create a mock of the QueryForm view, and pass it to the QueryFormPresenter to use.
    mockWindow = new Mock<IQueryForm>();
    presenter = new QueryFormPresenter(mockWindow.Object);
}

[Test]
public void User_Can_Execute_Selects_From_Any_Environment()
{
    Assert.AreEqual(false, presenter.IsDangerousSQL("select 1"));
}

[Test]
public void User_Cant_Execute_Schema_SQL_On_Any_Environment()
{
    Assert.AreEqual(true, presenter.IsDangerousSQL("alter table"));
    Assert.AreEqual(true, presenter.IsDangerousSQL("DrOp table"));
}

//Updates, Deletes and Selects are allowed in Test, but not in Production
[Test]
public void User_Can_Only_Execute_Updates_Or_Deletes_Against_Test()
{
    //mockWindow.SetupSet(w => w.Environment = Environments.Test);
    mockWindow.Object.Environment = Environments.Test;
    Assert.AreEqual(false, presenter.IsDangerousSQL("update "));
    Assert.AreEqual(false, presenter.IsDangerousSQL("delete "));

    //mockWindow.SetupSet(w => w.Environment = Environments.Production);
    //mockWindow.Object.Environment = Environments.Test;
    Assert.AreEqual(true, presenter.IsDangerousSQL("update "));
    Assert.AreEqual(true, presenter.IsDangerousSQL("delete "));
}

Я очень ценю любые идеи, которые кто-либо может предложить! А также, должен ли метод IsDangerousSQL действительно находиться в классе Model, поскольку он представляет бизнес-логику, а не непосредственно реагирует на действия пользователя?

Спасибо !!

Andy

1 Ответ

1 голос
/ 13 августа 2009

Предполагая, что ваш тестируемый код проверяет свойство Environment, вы хотите использовать SetupGet вместо SetupSet (т.е. сообщить макету, что возвращать, когда вызывается его свойство среды)

mockWindow.SetupGet(s => s.Environment).Returns(Environments.Test);

Это потому, что вы не устанавливаете свойство в коде, который вы получаете.

В качестве альтернативы, если вы хотите рассматривать свойство Environment как стандартное свойство, то, что вы делаете, когда пишете операторы типа

mockWindow.Object.Environment = Environments.Test;

Вы можете использовать

mockWindow.SetupProperty(qf => qf.Environment);

Лично я предпочитаю первый подход.

...