2012-12-10 4 views
5

私はMoqとユニットテストの初心者です。私はユニットテストをやっていると、これは次のコードです:Moqとのユニットテストインターフェイス

private Mock<IServiceAdapter> repository; 

    [TestInitialize] 
    public void Initialize() 
    { 
     repository= new Mock<IServiceAdapter>(); 
    } 

[TestMethod()] 
    public void SaveTest() 
    { 
     //Setup 
     string Name = "Name1"; 
     string Type = "1"; 
     string parentID = null; 

     repository.Setup(x => x.Save(Name , Type, parentID)).Returns("Success").Verifiable(); 

     //Do 
     var result = repository.Object.Save(Name , Type, parentID); 
     //Assert 
     repository.Verify(); 
    } 

私の問題は、テストは常に他の言葉で、私は戻り値のパラメータに入れた文字列を返すことで、それは常に「成功を返します。 "または私がその場所に書き込むものは何でも。私はそれがサービスの実際の行動ではないので正しくないと思う。私がテストしようとしている「保存」サービスの実際の動作をどのように反映できるかは誰でも知ることができます。したがって、戻り文字列がサービスメソッドと異なる場合、テストは失敗するはずです。

編集

ServiceAdapterインターフェイス私はRESTサービスのように呼び出すWebサービスのための単なるラッパー。これはWebフォームプロジェクトです。

私はそれを動作させるために、依存性注入とFakeControllerのようなものを作成する必要があり、私はこの記事で

How to mock a web service

のようなものをやっていますか?

答えて

11

あなたは実際のアプリケーションでこのモックが使用されていないため、何も表示されません。ユニットテストでは、実際のアプリケーション(インターフェース実装)に存在する実際のオブジェクトを作成してテストする必要があります。テスト中のオブジェクトの依存関係をモックするために使用されるモック。

サービスモックオブサービスアダプタは、そのアダプタを使用するオブジェクトのテストに役立ちます。いくつかのコントローラーテスト:

private FooController _controller; // object under test, real object 
private Mock<IServiceAdapter> _serviceAdapter; // dependency of controller 

[TestInitialize] 
public void Initialize() 
{ 
    _serviceAdapter = new Mock<IServiceAdapter>(); 
    _controller = new FooController(_serviceAdapter.Object); 
} 

[TestMethod()] 
public void SaveTest() 
{ 
    // Arrange 
    string name = "Name1"; 
    string type = "1"; 
    string parentID = null; 

    _serviceAdapter.Setup(x => x.Save(name , type, parentID)) 
        .Returns("Success").Verifiable(); 

    // Act on your object under test! 
    // controller will call dependency 
    var result = _controller.Bar(name , type, parentID); 

    // Assert 
    Assert.True(result); // verify result is correct 
    _serviceAdapter.Verify(); // verify dependency was called 
} 
+0

私はここに何かがありません。私はコントローラを持っていません(Webフォーム)。私は質問にさらなる情報を載せます。 –

+0

@MorganSorenコントローラは単なる例でした。サービスアダプタを使用する他のクラスでも可能です。私はWebフォームは単なるテスト可能なユニットではないと考えています。通常、テスト可能なWebフォームアプリケーションを作成するために使用されるMVPパターンです。 –

+0

@MorganSorenは、[unit-testing web forms]に関する質問です(http://programmers.stackexchange.com/questions/116089/is-is-possible-to-unit-test-a-web-forms-site) –