Dapper:单元测试SQL查询

asc*_*man 4 .net c# tdd unit-testing dapper

我开始使用DAPper,微型ORM,我使用Dapper Rainbow.我想测试查询和它们检索的数据.

我的意思是,例如,我有UserService和方法GetAll(),我想测试sql查询是从一些列表中检索所有用户(而不是从数据库,因为我希望测试快速).你知道我怎么做的吗?

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

public static class UserService{
    public static IEnumerable<User> GetAll(){
        return DB.Users.All();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

And*_*rew 8

我建议阅读依赖注入和存储库模式.如果你采用上面代码中的方法,你将很难模拟出依赖关系,因为类和方法是静态的.

这是一个更好的方法.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在进行测试,您可以模拟您的存储库.我使用一个名为NSubstitute的模拟框架,在我看来它比上面提到的其他框架简单得多,但这是个人偏好.首先,您可以在没有任何模拟框架的情况下编写测试.

public class FakeUserRepository : IUserRepository
{
  public IEnumerable<User> GetAll()
  { 
    return new List<User> { new User {FirstName='Bob', LastName='Smith'}, };
  }
}
Run Code Online (Sandbox Code Playgroud)

在你的测试中

[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);   
}
Run Code Online (Sandbox Code Playgroud)

这个例子有点人为,因为测试你是否可以从假存储库中获取数据并没有多大意义.你如何在现实中使用它是因为你的服务中有一些业务逻辑说回到用户然后检查它们是否比某个年龄或某些年龄大.例如UserService上的IsLegalDrivingAge方法.

  • 谢谢,这非常有帮助.但是,我最需要的是测试sql查询,我的类的一些方法运行原始查询.有什么办法可以加载可供查询检索的假数据吗?你知道我怎么测试它?谢谢! (2认同)