0

私は単体テストを書き始めており、「実際の」データを使用せずに機能をテストできるように、優れたリポジトリ パターン/moq を実装しています。これまでのところとても良い..しかし..

「投稿」のリポジトリ インターフェイスにIPostRepositoryは関数があります。 Post getPostByID(int id); これを Test クラスからテストできるようにしたいのですが、方法がわかりません。

これまでのところ、テストに次のパターンを使用しています。

[SetUp]
public void Setup()
{
    mock = new Mock<IPostRepository>();
}

[Test]
public void someTest()
{
    populate(10);  //This populates the mock with 10 fake entries

    //do test here
}

私の関数「someTest」では、関数を呼び出し/テストできるようにしたいと考えていますGetPostById。で関数を見つけることができますmock.object.getpostbyidが、「オブジェクト」はnullです。

どんな助けでも大歓迎です:)

iPostRepository:

public interface IPostRepository
{
    IQueryable<Post> Posts {get;}

    void SavePost(Post post);
    Post getPostByID(int id);
}
4

3 に答える 3

2

どの単体テスト フレームワークを使用しているかはわかりませんが、NUnit を使用しています。私は単体テストのプロではありませんが、開始して結果を得るには十分な知識があります。

私は通常、サービス層を持っており、これは私の投稿リポジトリを呼び出します:

public class PostService
{
     private readonly IPostRepository postRepository;

     public PostService(IPostRepository postRepository)
     {
          if (postRepository== null)
          {
               throw new ArgumentNullException("postRepository cannot be null.", "postRepository");
          }

          this.postRepository = postRepository;
     }

     public Post GetPostById(int id)
     {
          return postRepository.GetPostById(id);
     }
}

単体テストは次のようになります。

[TestFixture]
public class PostServiceTests
{
     private PostService sut;
     private Mock<IPostRepository> postRepositoryMock;
     private Post post;

     [SetUp]
     public void Setup()
     {
          postRepositoryMock = new Mock<IPostRepository>();

          sut = new PostService(postRepositoryMock.Object);

          post = new Post
          {
               Id = 5
          };
     }

     [Test]
     public void GetPostById_should_call_repository_to_get_a_post_by_id()
     {
          int id = 5;
          postRepositoryMock
               .Setup(x => x.GetPostById(id))
               .Returns(post).Verifiable();

          // Act
          Post result = sut.GetPostById(id);

          // Assert
          Assert.AreEqual(post, result);
          postRepositoryMock.Verify();
     }
}

これが役立つことを願っています。

于 2012-04-10T11:34:10.597 に答える
1

モック オブジェクトが結果 (null 以外) を返すようにする場合は、次のように設定する必要があります。

mock.Setup( m => m.GetPostByID( 5 ) ).Returns( new Post() );

あなたが正確に何を返すかは、もちろんあなた次第です。

アップデート:

メソッド パラメータを使用する必要がある場合は、CallBackを設定することもできます。例えば:

mock.Setup( m => m.GetPostByID( It.IsAny<int>() ) )
    .Callback( id => return new Post{ Id = id; } );

これにより、モックにデータを準備する必要がないため、セットアップ コードがはるかに簡単になります。

于 2012-04-10T11:25:55.320 に答える
1

の実際の実装をテストする場合は、 のGetPostById実際の実装を介して行いIPostRepositoryます。Moq (および一般的なモック) は、本物を使用したくない場合にのみ使用します。

言い換えれば、いくつかの投稿でデータベースを準備し、実際のリポジトリを新たにGetPostById作成し、結果に対して呼び出してアサーションを作成します。ただし、これは厳密には単体テストではなく、データベースが含まれているため統合テストです。

于 2012-04-10T11:15:03.843 に答える