Dapper:单元测试 SQL 查询

2024-01-09

我从 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(使用前将#替换为@)

Dapper:单元测试 SQL 查询 的相关文章

随机推荐

  • 声纳 - 无法请求服务器版本 | HTTP 状态 404

    我正在为 Java 设置一个声纳系统 我的本地测试 SonarServer 4 0 成功连接并处理我的 antscript 我使用的是 sonar ant task 2 2 jar 但我的目标服务器 3 7 3 甚至不提供服务器版本 我尝试
  • PHP | Define() 与 const

    在 PHP 中 可以通过两种方式声明常量 With define keyword define FOO 1 Using const keyword const FOO 1 这两者之间的主要区别是什么 何时以及为何应使用其中一种 何时使用另一
  • WASM 可以在没有任何 JavaScript 的情况下访问 DOM 吗?

    有没有什么方法可以在没有 JavaScript 的情况下获得对 DOM 和 或 WebAPI 即全屏 API 的读 写访问权限 我正在尝试用 C 语言构建一个基本应用程序 C 源代码实际上是 GC 语言转译的结果 我正在构建的应用程序将作为
  • 取消线程或永久删除单个 Gmail 邮件,而不关闭线程

    我有从扫描仪通过电子邮件收到的文档 扫描仪无法改变主题 来自扫描仪的所有电子邮件主题均相同 扫描到电子邮件服务器作业 但是 每个文件名都是唯一的 谷歌将消息串联起来 而我通常希望继续进行串联 我运行一个脚本来提取 PDF 并放入驱动器 然后
  • 如何在目录上运行coverage.py?

    我有一个目录tests其中包括许多不同的测试 名为test 我试着跑coverage run tests但它不起作用 如何运行单个命令来覆盖目录中的多个文件 下面是一个完整的示例 其中来自同一 PWD 的所有阶段的命令都集中在一个位置 通过
  • 计算两个重复列表的差异

    我有两个清单 List
  • 为什么 join() 不自动将其参数转换为字符串?你什么时候不希望它们成为字符串?

    我们有一个清单 myList 1 two 想要打印出来 通常我会使用类似的东西 0 and 1 format myList 但你也可以这样做 and join myList 但不幸的是 gt gt gt and join myList Tr
  • 如何使用 google Mailapp 回复电子邮件线程?

    我正在使用 google Mailapp Api 从电子表格自动发送电子邮件 我编写了一个脚本来自动发送带有电子表格数据的电子邮件 目前 我的脚本会发送一封新电子邮件 有没有办法使用 google Mailapp api 向现有电子邮件线程
  • 打印时在 PDF 中插入空白页

    我确信这个问题无处不在 尽管我似乎找不到答案 我希望我的 PDF 文档在 PDF 阅读器中显示时没有空白页 但在封面后打印空白页 这样打印出来的文档右侧奇数页 左侧偶数页 有其他人遇到这个问题和 或找到解决方案吗 您可以使用多价工具 下载多
  • 如何将 Node.js 和 NPM 更新到最新版本?

    我刚刚安装了 Node js 和 NPM 节点包管理器 我安装了 NPM 来访问其他 Node js 模块 安装 Node js 和 NPM 后 我注意到两者都没有可用的最新版本 如何将 Node js NPM 和我的 Node js 模块
  • 错误:实体必须至少有 1 个用 @PrimaryKey 注释的字段

    我是使用房间持久性的新手 每当我尝试运行代码时都会出现此错误 编辑时没有显示错误 但我在 gradle 上遇到构建错误 我不得不复制粘贴代码 但似乎没有一个起作用 这让我很失望 错误如下 error An entity must have
  • NavigationLink 内的 tvOS 按钮不起作用

    我已经使用 swift 和 swiftui 构建了一个 iOS 应用程序 现在我正在开发该应用程序的 tvOS 版本 但是 我有几个问题 其中一个问题仍未解决 tvOS 文本字段透明背景 https stackoverflow com qu
  • 是否可以等到所有 javascript 文件加载完毕后再执行 javascript 代码?

    我们有几个 JavaScript 文件 我们在母版页的底部加载它们 但是 我遇到的情况是 我需要在加载其他脚本之前执行一些 JavaScript 是否可以等到所有 JavaScript 文件加载完毕后再执行一些 JavaScript 代码
  • 从 SCM 检出 Maven 项目 - 无连接器

    我在 Eclipse Indigo 中签出 Maven 项目时遇到问题 我已经安装了 m2e 插件 Subclipse Git 但无法选择合适的 SCM 类型 如何解决这个问题 阿凡是对的 连接器仍然在 Indigo 中 只是隐藏了一点 启
  • MotionLayout:同一视图上的 OnSwipe 和 OnClick

    我正在为我的页面使用 MotionLayout 我有两种状态 可以通过视图的 OnSwipe 进行切换
  • 从 Finalizer 调用托管资源是否安全? (如果我检查空)

    打电话不安全吗 组件 Dispose 如果我检查空 如果我将代码更改为 MyResource Dispose public void Dispose Check to see if Dispose has already been call
  • 错误:服务“xxx”使用未定义的网络“xxx”

    它一直对我说网络是不明确的 错误 服务frontend network使用未定义的网络frontend network 然而 我看到已经有这样一个网络 docker网络ls 我错过了什么 我需要你的帮助 我在谷歌上读了很多相关内容 但找不到
  • Google表格查询非连续范围

    是否可以编写一个引用非相邻 不连续 不连续 我不知道正确的短语 范围的查询 在公式内 例如 query A2 C E2 F 选择 Col2 其中 Col5 3 我希望能够将查询放在 D 列中 因此我想分割它周围的范围 如果我只是说 Quer
  • 在Python中迭代多个列表中值的所有组合[重复]

    这个问题在这里已经有答案了 给定多个可能不同长度的列表 我想迭代所有值的组合 每个列表中的一项 例如 first 1 5 8 second 0 5 4 然后我希望的输出是 combined 1 0 5 1 4 5 0 5 5 4 8 0 5
  • Dapper:单元测试 SQL 查询

    我从 Dapper 微型 ORM 开始 我使用 Dapper Rainbow 我想测试查询和它们检索的数据 我的意思是 例如 我有用户服务用方法GetAll 并且我想测试 sql 查询是否从某个列表中检索所有用户 不是从数据库中检索 因为我