我从 Dapper(微型 ORM)开始,我使用 Dapper Rainbow。我想测试查询和它们检索的数据。
我的意思是,例如,我有用户服务用方法GetAll(),并且我想测试 sql 查询是否从某个列表中检索所有用户(不是从数据库中检索,因为我希望测试速度更快)。你知道我该怎么做吗?
我的服务类(以及我想测试的方法):
public static class UserService{
public static IEnumerable<User> GetAll(){
return DB.Users.All();
}
}
您对单元测试查询和数据检索有什么建议吗?
Thanks
我建议阅读依赖注入和存储库模式。如果您采用上面代码中的方法,您将很难模拟依赖关系,因为类和方法是静态的。
这是一个更好的方法。
public interface IUserRepository
{
IEnumerable<User> GetAll()
}
public class UserRepository : IUserRepository
{
public IEnumerable<User> GetAll()
{
return DB.Users.All();
}
}
public class UserService
{
IUserRepository _userRepository;
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository
}
public Enumerable<User> GetAll(){
return _userRepository.GetAll();
}
}
现在为了测试,您可以模拟您的存储库。我使用一个名为 NSubstitute 的模拟框架,在我看来,它比上面提到的其他框架简单得多,但这是个人偏好。首先是如何在没有任何模拟框架的情况下编写测试。
public class FakeUserRepository : IUserRepository
{
public IEnumerable<User> GetAll()
{
return new List<User> { new User {FirstName='Bob', LastName='Smith'}, };
}
}
在你的测试中
[Test]
public void GetAll_ShouldReturnAllFromFake()
{
// Arrrange
var userService = new UserService(new FakeUserRepository())
// Act
var result = userService.GetAll();
// Assert
var user = result[0];
Assert.AreEqual("Bob", user.FirstName);
Assert.AreEqual("Smith", user.LastName);
}
这个示例有点做作,因为测试您是否可以从假存储库获取数据并没有真正的意义。在现实中,如果您的服务中有一些业务逻辑,即返回用户,然后检查他们是否超过特定年龄或其他年龄,那么您在现实中将如何使用它。例如UserService 上的 IsLegalDrivingAge 方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)