【问题标题】:Why use Mocks and Stubs to test a Rails Application?为什么使用 Mocks 和 Stubs 来测试 Rails 应用程序?
【发布时间】:2018-04-12 14:39:31
【问题描述】:

我不是在询问测试替身(模拟)和接收(存根)的定义。我从 SO 那里得到了plenty。我只是不明白为什么需要在测试中。从我正在审查的一个 Rspec 示例中,程序员使用了这个:

it "allows setting responses" do
  dbl = double("Chant")
  allow(dbl).to receive(:hey!) { "Ho!" }
  expect(dbl.hey!).to eq("Ho!")
end

无论我们运行这个特定示例多少次,它总是会通过。它永远不会失败。测试的目的是确定一个例子是通过还是失败。那么,如果它总是会通过,为什么还要有一个双倍呢?

【问题讨论】:

  • 你是对的,在这种情况下它没有区别......但是有很多情况下它是有用的

标签: ruby-on-rails ruby unit-testing rspec


【解决方案1】:

当您的测试满足您的应用程序或被测对象的边界时,可以使用模拟和存根。

例如,如果您正在测试依赖于 B 的对象 A,如果 B 的行为不相关或设置 B 的成本很高,您可以选择存根 B。

它们也可用于执行确定性。例如:

class DiceRoll
  attr_accessor :value

  def initialize
     @value = (1..6).to_a.sample
  end
end

在这里,我们可能会选择存根 dice_roll.value,以便我们可以确定地指定在使用它的类中应该发生什么。这方面的一个常见示例是在 HTTP 客户端中测试网络故障,除非您非常快速地拔掉插头,否则这很难实现。

存根可用于存根配置,例如 ENV var,以测试组件如何根据外部因素运行。

它们还可用于消除对外部协作者的依赖,例如 API、数据库甚至文件系统。

一个常用的例子是FactoryBot.build_stubbed,它创建了一个模型实例,该实例的行为就像它已被持久化而不实际接触数据库一样。

为此而进行存根或模拟没有内在价值。它们是可用于解决棘手情况或提高性能的工具。模拟应始终与测试敏锐度进行权衡 - 这是您的测试实际测试应用程序的程度。

【讨论】:

    【解决方案2】:

    这个测试确实不是很有用。但是假设您正在测试,例如,导出生成功能。要构建导出文件,您需要调用外部服务(如数据库或 API)。为了测试生成内容的正确性,您可以假设服务按预期工作并返回已知良好的格式良好的响应。这就是你存根/模拟它的地方。

    【讨论】:

      【解决方案3】:

      在 Rails 的上下文中,存根/模拟对于坚持看起来合理的test pyramid 非常宝贵。

      以 Rails 控制器测试为例。

      Rails 控制器:

      1. 接收请求正文
      2. (理想情况下)将与处理请求相关的繁重工作委托给其他对象
      3. 响应请求

      然后,单元测试控制器将涉及通过测试记录控制器对各种请求主体的积极响应——人们应该关心的是请求、控制器操作的响应以及执行该操作的对象的返回值步骤2. 中的繁重工作,可以通过在步骤2. 中模拟对象或通过存根某些方法调用的响应来轻松实现。 (作为先决条件,我会确保执行繁重任务的对象在控制器测试中模拟它们之前有自己的单元测试。)

      根据您的应用程序,您还可能决定不使用模拟编写控制器测试,而是编写集成测试来测试对象。这有时是理想的方法,尤其是当工作对象本身非常轻量时。归根结底,我会尽量确保不会颠倒测试金字塔,尽管在某些情况下这样做可能是可以的。

      在模型/服务对象测试中,就我个人而言,如果操作昂贵且冗余,我也喜欢不与数据库交互。

      模拟的优势在集成测试中很明显,尤其是在基于微服务的架构中,您的应用程序必须通过网络进行通信,而不关心其他服务如何处理请求。能够存根其他服务的响应非常重要。

      【讨论】:

        猜你喜欢
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-25
        • 2022-12-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        相关资源
        最近更新 更多