2009-08-07 11 views
2

私は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を使用したいと思い環境プロパティをチェックしていると仮定すると、アンディ

+0

コメントアウトされたコードについて説明できますか?それはあなたがそれを使用する必要があるように見えます。 –

+0

コードが "表示のプレゼンテーション"に関連している場合は、VMに存在する必要があります。たとえば、不良SQLを強調表示したい場合などです。そうでない場合(非ビューのクライアントにも必要な場合など)、おそらくモデルやユーティリティクラスに深く入るはずです。 – Gishu

答えて

1

(すなわち、その環境プロパティが呼び出されたときに返すためにどのようなモックを伝える)

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

これは取得しているコードにプロパティを設定していないためです。

また、あなたが

mockWindow.Object.Environment = Environments.Test; 

のような文を書くとき、あなたがやっていることである標準プロパティとして環境プロパティを処理したい場合は、

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

個人的に使用することができます私は最初のアプローチを好む。

+0

ありがとうございます!私がmockWindow.Object.Environment = Environments.Test;を組み合わせても、2番目のアプローチは動作しません。 mockWindow.SetupProperty(qf => qf.Environment);を使用します。私は第1のアプローチが行く方法だが、同意する。ありがとう!! – Andy