2016-08-02 5 views
1

ユニットコードのテストに役立つRhino.MocksとStructure mapを使用しています。私は、彼ら自身が走った時に合格するいくつかのテストを持っています。これらの単体テストの設定コードは、次のとおりです。単体テストが正しいモッククラスを使用していません

私のテストでは、このインターフェイスをスタブしてメソッドを呼び出します。

[TestMethod] 
public void AreMultiple_Test() 
{ 
    var mackIManager = MockRepository.GenerateMock<IManager>(); 
    mackIManager.Stub(u => u.GetTwoUserName(Arg<int>.Is.Anything)).Return(null); 
    ObjectFactory.Inject(typeof(IManager), mackIManager); 

    StepAdditionalActionBase actionBase = new StepAdditionalActionBase(); 
    bool areMultiple = actionBase.AreMultiple(new WorkOrder { Id = "123" }); 

    Assert.IsFalse(areMultiple); 
} 

試験方法2

[TestMethod] 
public void AreMultiple_Test() 
{ 
    var mackIManager = MockRepository.GenerateMock<IManager>(); 
    mackIManager.Stub(u => u.GetTwoUserName(Arg<int>.Is.Anything)).Return("123"); 
    ObjectFactory.Inject(typeof(IManager), mackIManager); 

    StepAdditionalActionBase actionBase = new StepAdditionalActionBase(); 
    bool areMultiple = actionBase.AreMultiple(new WorkOrder { Id = "123" }); 

    Assert.IsTrue(areMultiple); 
} 

これは、次のコードをテストするユニットです。

public bool AreMultiple(WorkOrder workOrder) 
{ 
    string secondUser = _handler.GetTwoUserName(_workflowManager.GetNumberForProject(workOrder.Id)); 
    if (String.IsNullOrEmpty(secondUser)) 
    { 
     return false; 
    } 

    return true; 
} 

私はそれらを単独で実行すると、正常に動作します。私がそれらを一緒に走らせると、最初のパスと2番目のパスが失敗します。私が2番目のものをデバッグすると、Stubbedメソッドの戻り値がまだnullに戻っていることがわかります。新しいStubbedメソッドを使用するにはどうすればよいですか?

更新。

私はコンテナとしてStructureMapを使用しています。私が見つけたことから、次のコードは、linkから取得したコンテナを処分するために使用されるコードです。これを追加すると、一緒に走ってもテストは失敗しますが、個別に実行されたときには合格になります。

[TestCleanup()] 
public void TestCLeanup() 
{ 
    ObjectFactory.Container.Dispose(); 
} 
+0

どのように '_handler'フィールドを解決しますか? –

答えて

1

テストは1つずつ動作しますが、すべて一緒に実行すると失敗します。問題は、共通のの部分にある必要があります。これらの部分は、テストによって共有されているため、相互に依存しています。この特定のケースでは、静的であるObjectFactory以外は何もありませんが、Service Locator(アンチパターン)です。テストでは

、あなたがIManagerインターフェイスを模擬し、のObjectFactoryに登録:

ObjectFactory.Inject(typeof(IManager), mackIManager); 

はその後SUTを解決し、嘲笑インタフェースを使用するようにのObjectFactoryサービスロケータを使用しています(_handlerフィールド) :

string secondUser = _handler.GetTwoUserName(...) 

私は最初のテストがを登録していると思われるを参照し、それを正しくクリーニングしないでください。同じインスタンスが2番目のテストに表示されます。 Register Resolve Releaseパターンの後にテスト間でObjectFactoryをリセットする必要があります。

別の(好ましい)オプションは、constructorによって明示的にIManager handler依存関係を受け取るようにSUTをリファクタリングすることです。これにより、SUTとObjectFactory構成をComposition Rootに移動するテストが簡素化されます。

+0

これで工場をリセットする方法は?それは私が探している質問の答えになるでしょう。 – Nate

+0

私は工場の廃棄方法を調べて、それを私の質問に加えました。その追加でも、私はまだ同じ問題を抱えています。 – Nate

+0

セットアップメソッドで 'x'とは何か、' Handle'は何ですか?それらは静的ですか? –

関連する問題