2

テストメソッドでオブジェクトパラメータを渡すベストプラクティスは何ですか? この場合、何を使用しますか?(モック、スタブ、またはオブジェクトのインスタンスを作成して埋める)

例えば:

[Test]
public void LoadContentsFor_ValidUser_ReturnsEmptyList()
{
    var user = new User {Id = 1, FirstName = "Test"};
    var contents = this.contentPresentationService.LoadContentsFor(user);
    Assert.IsTrue(contents.Count == 0);
}

またはモックを使用する:

[Test]
public void LoadContentsFor_ValidUser_ReturnsEmptyList()
{
    var user = new Mock<User>();
    user.Setup(x => x.Id).Returns(1);
    user.Setup(x => x.FirstName).Returns("Test");
    var contents = this.contentPresentationService.LoadContentsFor(user.Object);
    Assert.IsTrue(contents.Count == 0);
}
4

2 に答える 2

1

あなたの場合、最初の例のようにユーザーの具体的なオブジェクトを作成します。テスト対象のコードの境界内に存在するため、モックする必要はありません。

テスト対象のコードの境界外に存在し、データ アクセス、サービス、セッション管理などを実装するオブジェクトには、密結合しないようにインターフェイスが必要です。これらのインターフェイスを使用すると、これらの領域を簡単にモックできるため、実際のデータ操作は行われません。

于 2012-11-07T12:19:33.867 に答える
1

この単純なオブジェクトである場合は、手動で作成するか、 AutoFixtureNBuilderなどのビルド ツールを使用することをお勧めします(どちらのライブラリも、あなたが求めている正確な問題に対処するように設計されています)。

// AutoFixture example
var fixture = new Fixture();
var user = fixture
    .Build<User>()
    .With(u => u.Id, 1)
    .With(u => u.FirstName, "John")
    .CreateAnynomous();

それに加えて、AutoFixture はさらに多くの便利な機能を提供します。

  • プロパティのデータの自動生成
  • 不要なプロパティをスキップする
  • 特定のプロパティをautomocksに置き換えます(AutoMoqを見てください)

それらは異なる役割を提供するため、モックフレームワークが提供しない機能。もちろん、引き続きモックを使用しても何も起こりませんが、前述の異なる目的を考えると、コードの読者を混乱させる可能性があります。

于 2012-11-07T12:05:01.467 に答える