【发布时间】:2014-10-11 06:14:36
【问题描述】:
我在真正测试架构的查询端时遇到了问题,我正在调用一个需要Expression<Func<T, bool>> 作为过滤参数的存储库。我试图理解这个article,马克说要使用存根进行查询。
假设我有一个查询处理程序:
public class GetUserByEmailQueryHandler : IQueryHandler<GetUserByEmailQuery, User>
{
private readonly IGenericRepository<User> userRepository;
public GetUserByEmailQueryHandler(IGenericRepository<User> userRepository)
{
this.userRepository = userRepository;
}
public User Handle(GetUserByEmailQuery query)
{
return this.userRepository.Find(u => u.Email == query.Email && u.IsLockedOut == false);
}
}
现在我的测试将如下所示:
[Fact]
public void Correctly_Returns_Result()
{
// arrange
var id = Guid.NewGuid();
var email = "test@test.com";
var userRepositoryMock = new Mock<IGenericRepository<User>>();
userRepositoryMock.Setup(
r =>
r.Find(It.IsAny<Expression<Func<User, bool>>>())).Returns(new User { UserId = id }).Verifiable();
// Act
var query = new GetUserByEmailQuery(email);
var queryHandler = new GetUserByEmailQueryHandler(userRepositoryMock.Object);
var item = queryHandler.Handle(query);
// Assert
userRepositoryMock.Verify();
Assert.Equal(id, item.UserId);
}
对我来说,这个测试毫无用处,尤其是使用It.IsAny<Expression<Func<User, bool>>>(),因为我可以过滤任何东西。过滤器将是需要测试的关键业务逻辑。如何测试这样的表达式?这是通用存储库不好的原因之一吗?我应该使用一个特定的存储库,该存储库完全采用所需的过滤器参数?如果是这种情况,我会将表达式从一层移动到另一层,我仍然需要对其进行测试
如果我应该像 Mark 在他的博客中所说的那样使用存根,是否有任何示例?我是否应该在内存列表上运行此查询,以验证过滤器表达式是否正确?
【问题讨论】:
-
查询处理程序实现应该直接使用持久性,而不是存储库。查询处理程序在“精神”中只是一个存储库方法。
标签: c# domain-driven-design repository-pattern