2009-08-07 2 views
2

Я изучаю 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 быть в классе модели, поскольку он представляет собой бизнес-логику, а не непосредственно реагирует на действие пользователя?

Спасибо!

Энди

+0

Не могли бы вы объяснить прокомментированный код? Похоже, вы должны его использовать. –

+0

Если код связан с «представлением представления», он должен находиться в виртуальной машине - например, вы хотите выделить плохой sql. Если нет (например, он нужен и клиентам, не являющимся клиентом), он должен пойти глубже в модель или полезный класс. – Gishu

ответ

1

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

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

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

В качестве альтернативы, если вы хотите, чтобы рассматривать свойство окружающей среды в качестве стандартного имущества, которое является то, что вы делаете, когда вы пишете заявления, как

mockWindow.Object.Environment = Environments.Test; 

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

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

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

+0

спасибо! Второй подход не работает, хотя если я объединю mockWindow.Object.Environment = Environments.Test; с mockWindow.SetupProperty (qf => qf.Environment) ;. Я согласен с тем, что первый подход - это путь. Благодаря!! – Andy

Смежные вопросы