6

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();
    }

私の問題は、テストが常に、Returns パラメーターに入力した文字列を返すことです。つまり、常に「成功」​​またはその場所に書いたものを返すことです。それはサービスの実際の動作ではないため、正しくないと思います。テストしようとしている「保存」サービスの実際の動作を反映する方法を知っている人はいますか? つまり、戻り文字列がサービス メソッドと異なる場合、テストは失敗するはずです。

編集済み

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

私はこの記事のようなことをしています

Web サービスをモックする方法

それを機能させるには、依存性注入を使用して FakeController のようなものを作成する必要がありますか?

4

1 に答える 1

12

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

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

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
}
于 2012-12-10T07:45:08.460 に答える