2

以下に小さなサンプル ファクトリ パターンの実装がありますが、コード カバレッジを最大化するために、誰かが適切な Moq ユニット テスト ケースの作成を手伝ってくれるかどうか疑問に思っていました。

public class TestClass
{ 
    private readonly IService service;

    public TestClass(Iservice service)
    {
        this.service = service;
    }

    public void Method(string test)
    {
        service = TestMethod(test);
        service.somemethod();
    }

    private IService TestMethod(string test)
    {
        if(test == 'A')
            service = new A();
        if(test == 'B')
            service = new B();
        return service;
    }
}

私はモックを送信するときにTestClassとさらに重要なTestMethodをテストする際の助けを探しています。たとえば、私のテストメソッドは以下になります:

[TestMethod]
public void TestCaseA()
{
    Mock<IService> serviceMock = new Mock<Iservice>(MockBehaviour.strict);
    TestClass tClass = new TestClass(serviceMock.Object);

    // The Question is, what is best approach to test this scenario ?
    // If i go with below approach, new A() will override serviceMock
    // which i am passing through constructor.
    var target = tClass.Method("A");
}
4

1 に答える 1

5

それがあなたTestClassがテストしているものだからです。

これを機能させるには、 の読み取り専用プロパティを作成する必要がありますservice

public IService Service { get; private set; }

Methodコンストラクターとインスタンスの状態 (この場合Service) を変更する方法をテストする必要がありTestClassます。

テスト ケースMethodをテストする場合、テストは次のようになります。B

[TestMethod]
public void TestSomeMethod()
{
    // Arrange/Act
    var target = new TestClass((new Mock<IService>()).Object);
    target.Method("B");

    // Assert
    Assert.IsInstanceOfType(target.Service, typeof(B));
}

Aテスト ケースのコンストラクターをテストする場合、テストは次のようになります。

[TestMethod()]
public void TestCasesA()
{
    // Arrange/Act
    var target = new TestClass("A");

    // Assert
    Assert.IsInstanceOfType(target.service, typeof(A));
}

コンストラクター アプローチのみを使用してIService. これにより、アプリケーションの状態を減らす不変オブジェクトを持つことができます。

于 2013-04-02T18:34:03.910 に答える