7

それで、単体テスト用にモッキング フレームワーク (Moq) をいじっていますが、いつモッキング フレームワークを使用する必要があるのか​​疑問に思っていました。

次の 2 つのテストの利点と欠点は何ですか。

public class Tests
{
    [Fact]
    public void TestWithMock()
    {
        // Arrange
        var repo = new Mock<IRepository>();

        var p = new Mock<Person>();
        p.Setup(x => x.Id).Returns(1);
        p.Setup(x => x.Name).Returns("Joe Blow");
        p.Setup(x => x.AkaNames).Returns(new List<string> { "Joey", "Mugs" });
        p.Setup(x => x.AkaNames.Remove(It.IsAny<string>()));

        // Act
        var service = new Service(repo.Object);
        service.RemoveAkaName(p.Object, "Mugs");

        // Assert
        p.Verify(x => x.AkaNames.Remove("Mugs"), Times.Once());
    }

    [Fact]
    public void TestWithoutMock()
    {
        // Arrange
        var repo = new Mock<IRepository>();

        var p = new Person { Id = 1, Name = "Joe Blow", AkaNames = new List<string> { "Joey", "Mugs" } };

        // Act
        var service = new Service(repo.Object);
        service.RemoveAkaName(p, "Mugs");

        // Assert
        Assert.True(p.AkaNames.Count == 1);
        Assert.True(p.AkaNames[0] == "Joey");
    }
}
4

6 に答える 6

11

モック オブジェクトを使用して、完全に単体テストを作成します。これは、すべての依存関係が正しく機能すると想定され、知りたいのは SUT (テスト対象のシステム - テスト対象のクラスを表す凝った言い方) が機能するかどうかだけです。 .

モック オブジェクトは、構成した結果を生成する依存関係のモック バージョンを作成するため、依存関係が正しく機能することを "保証" するのに役立ちます。問題は、テストしている 1 つのクラスが、他のすべてが「機能している」ときに本来の動作をするかどうかです。

モック オブジェクトは、データベースや Web サービスなど、依存関係が遅いオブジェクトをテストする場合に特に重要です。実際にデータベースにアクセスしたり、実際の Web サービスを呼び出したりすると、テストの実行にさらに多くの時間がかかります。ほんの数秒の余分な時間であれば許容できますが、継続的インテグレーションサーバーで何百ものテストを実行していると、非常に高速になり、自動化が機能しなくなります。

これこそがモック オブジェクトを本当に重要なものにし、ビルド、テスト、デプロイのサイクル時間を短縮することです。テストを高速に実行することは、効率的なソフトウェア開発にとって重要です。

于 2013-10-30T05:56:04.570 に答える
1

モッキング フレームワークは、テスト対象のコードの統合ポイントをシミュレートするのに役立ちます。依存関係 (Person) をコードに直接挿入できるため、具体的な例はモッキング フレームワークの適切な候補ではないと主張します。この場合、モック フレームワークを使用すると、実際には複雑になります。

はるかに優れた使用例は、データベースを呼び出すリポジトリがある場合です。単体テストの観点からは、db 呼び出しをモックして、代わりに所定のデータを返すことが望ましいです。これの主な利点は、終了するデータへの依存関係を取り除くことですが、db 呼び出しによってテストが遅くなるため、パフォーマンスも低下します。

于 2013-10-30T18:28:27.607 に答える