4

RavenDBを使用して、次のブログ投稿(http://www.codecapers.com/post/Using-RavenDB-with-ASPNET-MVC.aspx)に記載されているリポジトリを使用して次のメソッドを作成しました。

public User GetUserById(string id)
{
     var user = (from usr in _repository.All<User>() where usr.Id == id select usr).FirstOrDefault();

     if (user == null)
     {
          throw new NullReferenceException("No user with the id (" + id + ") could be found.");
     }

     return user;
}

このメソッドをnunit(およびおそらくmoq)でどのように単体テストしますか?

「user」は単なる通常のクラスです。

4

4 に答える 4

2

通常、リポジトリ層に対して直接テストを作成することはありません。たとえば、nHibernateまたはEntity Frameworkを使用している場合、リポジトリに対してテストを実行すると、技術的にはそのフレームワークがテストされます。

作成者またはそれらのORMはすでにそれを行っています。

また、データベースと通信すると、テストは単体テストではなく統合テストになります。

単体テストは、たとえば、リポジトリ層をモックアウトするビジネス層に対して行われます。

統合テストを作成する場合は、ビジネスレイヤーに対しても作成しますが、リポジトリレイヤーをモックして通過させないでください。

于 2012-04-24T14:49:49.567 に答える
1

私はあなたのコードを準備するために次のことをします:

  1. _repositoryテスト用に簡単に変更できるように、コンストラクターまたはプロパティを介して渡されていることを確認してください。
  2. _repository変数がIRepository具象型ではなく型として宣言されていることを確認してください。

次に、テストで:

  1. インターフェイスのモックを作成し、これをあなたのに渡します_repository
  2. メソッドをオーバーライドして、テストに適した値を持つ.All<User>()既知のハードコードされたリストを返します。User
  3. 1つのテストで、既存のIDを照会したときに正しい値が返されることを表明します。
  4. 別のテストで、存在しないIDを照会すると例外がスローされることを表明します。
于 2012-04-24T14:52:19.757 に答える
0

最初の質問は次のようになります-このコンテキストで何をテストしていますか?提供されているメソッドの結果は実際には2つしかないため、基本的にusernullかどうかをテストしています。それは付加価値テストですか?

どのように、私は仮定する_repositoryことは何らかのメカニズムを介して注入されますか?もしそうなら、あなたは単にMock<IRepository>(あなたのタイプ名を適切に挿入する)を提供し、_repositoryそれが注入される場所の代わりにそれを注入します。次に、戻り値を設定し、メソッドで例外が発生するかどうかをテストできます。

mockRepository.Setup(x => x.All<User>()).Returns(new List<User> { ... });
于 2012-04-24T14:53:03.703 に答える
0

RavenDBは、単体テストのためにすべてをモックする必要がないように特別に設計されています。

メモリ内で実行するだけで、ユニットテストを直接実行できます。詳細については、このブログ投稿を参照してください。

次のようなコードを記述できます。

[Fact]
public void CanQueryForDistinctItemsUsingLinq()
{
    using (var store = NewDocumentStore())
    {
        using (var s = store.OpenSession())
        {
            s.Store(new { Name = "ayende" });
            s.Store(new { Name = "ayende" });
            s.Store(new { Name = "rahien" });
            s.SaveChanges();
        }

        store.DocumentDatabase.PutIndex("test", new IndexDefinition
        {
            Map = "from doc in docs select new { doc.Name }",
            Stores = { { "Name", FieldStorage.Yes } }
        });

        using (var s = store.OpenSession())
        {
            var objects = s.Query<User>("test")
                .Customize(x => x.WaitForNonStaleResults())
                .Select(o => new {o.Name })
                .Distinct()
                .ToList();

            Assert.Equal(2, objects.Count);
            Assert.Equal("ayende", objects[0].Name);
            Assert.Equal("rahien", objects[1].Name);
        }
    }
}

これはRavenDBユニット/統合テストからのものであるため、機能させるにはいくつかの機能が必要になりますが、一般的な考え方がわかります。

于 2012-04-24T20:07:48.440 に答える