Я изучаю TDD и шаблон MVP. Я создал простое приложение WinForms, которое похоже на замену инструмента TOAD SQL. Я пытаюсь вернуться и написать тесты для кода, который я уже написал (который, как я знаю, не является правильным процессом для TDD, но, пожалуйста, несите меня).Moq с WinForms MVP Pattern - Неудачный тест
В моем тестовом классе для формы я хочу протестировать бетон Presenter
, но извините WinForm, поскольку у ведущего есть реальная логика в нем, которая должна быть проверена. Однако, когда я высмеиваю представление с помощью Moq, я не вижу ожидаемых результатов. В приведенном ниже коде первые 2 теста PASS, но 3-й FAILS на первом 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
быть в классе модели, поскольку он представляет собой бизнес-логику, а не непосредственно реагирует на действие пользователя?
Спасибо!
Энди
Не могли бы вы объяснить прокомментированный код? Похоже, вы должны его использовать. –
Если код связан с «представлением представления», он должен находиться в виртуальной машине - например, вы хотите выделить плохой sql. Если нет (например, он нужен и клиентам, не являющимся клиентом), он должен пойти глубже в модель или полезный класс. – Gishu