私はTDDとMVPパターンを学んでいます。私は、TOAD SQLツールの代わりのような単純なWinFormsアプリケーションを作成しました。私は、私がすでに書いたコードのためのテストを書くことを試みています(これは私が知っているTDDの正しいプロセスではありませんが、私に負担してください)。部品番号 - 失敗テスト
フォーム用の私のテストクラスでは、具体的なPresenter
をテストしたいが、プレゼンターが実際のロジックをテストする必要があるので、WinFormを模擬してみよう。しかし、Moqを使用してビューをモックすると、予想される結果が表示されません。以下のコードでは、最初の2回はPASSをテストしますが、最初のアサートで3回目のFAILSを実行します。
私はNUnitのにデバッガをアタッチして実行するとpresenter.IsDangerousSQL
が呼び出されたときに、Environment
プロパティがEnvironments.Test
に設定されていない:
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クラスに含まれるべきですか?
ありがとうございます!
テスト対象のコードがあなたの代わりにSetupSetのSetupGetを使用したいと思い環境プロパティをチェックしていると仮定すると、アンディ
コメントアウトされたコードについて説明できますか?それはあなたがそれを使用する必要があるように見えます。 –
コードが "表示のプレゼンテーション"に関連している場合は、VMに存在する必要があります。たとえば、不良SQLを強調表示したい場合などです。そうでない場合(非ビューのクライアントにも必要な場合など)、おそらくモデルやユーティリティクラスに深く入るはずです。 – Gishu