我正在编写单元测试并实现了一个很好的存储库模式/ 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);
}
答案 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; } );
这可能会使您的设置代码更容易,因为您不需要使用数据填充模拟。