0

save() メソッドがありますが、テスト方法がよくわかりません。以下は私のコードです。

public interface IRepository<T>
{
    T Get(int id);
    void Save(T item);
    void Delete(int id);
}

save メソッドは値を返さないため、値を比較できません。しかし、私はすでに 4 人のユーザーを持っています。別のユーザーを追加した後、ユーザーの総数のみを確認します。それをテストするのに十分ですか?

[Test]
public void Add_a_new_smoothie_user_should_return_total_5_users()
{
    // Arrange

    var totalUsers = _users.Count();

    _mockUserRepository.Setup(s => s.Save(It.IsAny<User>()))
        .Callback((User user) => _users.Add(user));

    var newUser = new User
                      {
                          Id = 3,
                          Email = "newuser@test.com",
                          Password = "1234567".Hash(),
                          Firstname = "",
                          Lastname = "",

                          CreatedDate = DateTime.Now,
                          LastLogin = DateTime.Now,

                          AccountType = AccountType.Smoothie,
                          DisplayName = "",
                          Avatar = "",
                          ThirdPartyId = "",
                          Status = Status.Approved,
                          Ip = "127.0.0.1"
                      };

    // Act

    _mockUserRepository.Object.Save(newUser);

    // Assert

    Assert.AreEqual(5, _users.Count());
    Assert.AreEqual(1, _users.Count() - totalUsers);
}
4

3 に答える 3

3

テストしようとしている機能の一部をモックしています。Add()これらのテストでは、ユーザーを保持しているデータ型のメソッド以外は何も証明されません。最終的に、リポジトリが機能しているかどうかはわかりません。

リポジトリの機能をテストするために、データベース サンドボックスを実装するようにしてください。

于 2012-07-12T19:55:51.090 に答える
1

それらのテストは実際には何もテストしないため (フレームワークの実装のモックを除いて)、モック コードのテストを記述しないでください。

テストファーストアプローチでインターフェイスを作成するには? それは簡単です。いくつFooControllerかのデータが必要な があるとします。ある時点 (コントローラーのテストを書いているとき) で、そのデータをコントローラー (そう、リポジトリー) に提供する何らかの依存関係があると判断します。現在のコントローラー テストにはBar、データ ストレージからオブジェクトを取得するための機能が必要です。だから、あなたはテストを書く

Mock<IBarRepository> repositoryMock = new Mock<IBarRepository>();
repositoryMock.Setup(r => r.GetById(It.IsAny<int>()).Returns(new Bar());
FooController controller = new FooController(repositoryMock.Object);
controller.Exercise();

IBarRepositoryこの時点では、コントローラーに必要なインターフェースがないため、このテストはコンパイルされません。このインターフェイスを作成します。またGetById、このインターフェイスにメソッドを追加します。その後、コントローラーを実装します。

良いニュースです。コントローラーが完成すると、IBarRepositoryコントローラーにとって非常に便利な API を備えたインターフェース定義ができます。

次のステップは、IBarRepository実装の作成です。リポジトリのテストを書くことはめったにありません。ただし、いくつかの方法で実行できます。

  • リポジトリ (ORM フレームワーク、ADO.NET クラスなど) で使用されるデータ アクセス コードがある場合は、これらの依存関係をモックし、リポジトリの実装が基になるデータ アクセス コードに対して必要なすべての呼び出しを行うことを確認できます。これらのテストはかなり脆弱です。リポジトリに複雑なビジネスロジックが含まれることはめったにないため、あまりメリットがありません。
  • 実際のデータベース (インメモリ SQLite など) との統合テストを実行し、データが実際にデータベース テーブルで CRUD されていることを確認できます。これらのテストも脆く、非常に時間がかかります。ただし、この場合、そのリポジトリが正常に機能することは間違いありません。
于 2012-07-13T00:11:50.780 に答える
0

リポジトリはどこに保存されていますか? 何らかのファイルに保存している場合は、ファイルを、すべてが手動でチェックされ、問題がないモデル ファイル (gold) と比較できます。データベースがある場合は、データベース インターフェイスをモックし、すべての挿入クエリをログに記録してから、ログを理想的なログと比較する必要があります。

于 2012-07-12T19:59:39.283 に答える