0

我开始编写单元测试并实现了一个很好的存储库模式/起订量,允许我在不使用“真实”数据的情况下测试我的功能。到目前为止一切顺利..但是..

在我的“帖子”存储库界面中,IPostRepository我有一个功能: Post getPostByID(int id); 我希望能够从我的测试类中对其进行测试,但无法弄清楚如何。

到目前为止,我正在使用这种模式进行测试:

[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但“对象”为空。

任何帮助,将不胜感激 :)

iPost 存储库:

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

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

换句话说,用一些帖子来准备你的数据库,新建真正的存储库,调用GetPostById并对结果进行断言。这不是严格意义上的单元测试,而是集成测试,因为它包含数据库。

于 2012-04-10T11:15:03.843 回答
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; } );

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

于 2012-04-10T11:25:55.320 回答