存储库接口中的单元测试功能 - ASP.net MVC3&起订量

时间:2012-04-10 10:53:01

标签: asp.net-mvc-3 unit-testing testing moq

我正在编写单元测试并实现了一个很好的存储库模式/ moq,以便我可以在不使用" real"的情况下测试我的函数。数据。到目前为止很好......但是..

在我的存储库界面中,"帖子" 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
}

在我的功能&#34; someTest&#34;我希望能够调用/测试函数GetPostById。我可以找到mock.object.getpostbyid的函数,但&#34;对象&#34;是空的。

任何帮助将不胜感激:)

iPostRepository:

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

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

3 个答案:

答案 0 :(得分: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();
     }
}

我希望这会有所帮助。

答案 1 :(得分:1)

如果您想测试GetPostById的真实实现,请通过IPostRepository的实际实现来实现。 Moq(以及一般的模拟)仅适用于您不想使用真实物品的情况。

换句话说,使用一些帖子填充数据库,新建真实存储库,调用GetPostById并对结果进行断言。这不是严格的单元测试,而是集成测试,因为它包含数据库。

答案 2 :(得分:1)

如果您希望模拟对象返回结果(非空),则需要进行设置:

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

这可能会使您的设置代码更容易,因为您不需要使用数据填充模拟。