2012-04-10 5 views
0

私は単体テストを作成しています。本当のデータを使わずに自分の関数をテストできるようにmoqを実装しました。私は私のテストクラスからこれをテストすることができるようにしたいが、どのようにうまくいかないことができ Post getPostByID(int id); :これまでのところは良い..しかし..「記事」IPostRepositoryのための私のリポジトリインターフェイスでユニットテスト機能はリポジトリインタフェース内にあります - ASP.net MVC3&Moq

私は機能を持っています。

これまでのところ、私は私のテストのために、このパターンを使用しています:私の機能で

[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); 
} 
+1

'populate(10)'はどのようにデータを作成しますか?モックの 'object'プロパティでヌル参照例外を取得すると、モックがインスタンス化されていないことを意味しますが、あなたは' [SetUp] 'でそれを行っているように見えます。 '[SetUp]'が期待どおりに動いていることを確認する価値があります。 – ataddeini

+0

ああ、私は今理解していると思う - 私は "オブジェクト"がnullであると私はあなたがモックの 'オブジェクト 'プロパティを意味すると思ったと読んだ。私はMarnixがあなたの答えを持っていると思う。 – ataddeini

+0

@ataddeiniええ、人口は反復するだけで、すべてのテストケースで同じ10行を書いてくれません! – JustAnotherDeveloper

答えて

1

あなたのモックオブジェクトは、(nullではない)の結果を返したい場合は、あなたがそれを設定する必要があります。

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

何が正確に返すことはもちろんあなた次第です。

更新:

あなたがすることができ、セットアップCallBackメソッドのパラメータを使用する必要がある場合。例:

これは、モックをデータでプライミングする必要がないため、セットアップコードを簡単にすることができます。

+0

ダム!私は私のアイデアにとても近いので、私はこれをしましたが、returns()関数については知らなかったのです!私はこれを後で見ます:) – JustAnotherDeveloper

1

あなたがGetPostByIdの実際の実装をテストする場合は、IPostRepositoryの実際の実装を経由して行ってください。 Moq(および一般的なモック)は、実際のものを使用したくない状況のためだけです。

つまり、いくつかの投稿でデータベースをプライムし、実際のリポジトリを新規に作成し、GetPostByIdと呼び出して、結果をアサーションします。これは厳密に単体テストではありませんが、データベースが含まれているため統合テストです。

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(); 
    } 
} 

私はこのことができます願っています。

+0

週末にこれらのアイデアの選択を試みましたが、これはかなりいいです!私は将来それを使用します! – JustAnotherDeveloper

+0

もしそれが助けてくれたら、それを上げてください:) –

関連する問題