gpt4 book ai didi

c# - Dapper:单元测试 SQL 查询

转载 作者:太空狗 更新时间:2023-10-30 00:19:26 31 4
gpt4 key购买 nike

我从微型 ORM Dapper 开始,我使用 Dapper Rainbow。我想测试查询及其检索到的数据。

我的意思是,例如,我有方法为 GetAll()UserService,我想测试 sql 查询是否正在从某些数据库中检索所有用户列表(不是来自数据库,因为我希望测试更快)。你知道我该怎么做吗?

我的服务类(以及我要测试的方法):

public static class UserService{
public static IEnumerable<User> GetAll(){
return DB.Users.All();
}
}

您对单元测试查询和数据检索有什么建议吗?

谢谢

最佳答案

我建议阅读依赖注入(inject)和存储库模式。如果您采用上面代码中的方法,您将很难模拟依赖项,因为类和方法是静态的。

这是一个更好的方法。

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 方法。

关于c# - Dapper:单元测试 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20461553/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com