gpt4 book ai didi

ruby-on-rails - RSpec 的期望如何在 ROR 中工作

转载 作者:数据小太阳 更新时间:2023-10-29 06:35:01 25 4
gpt4 key购买 nike

在阅读 Michael Hartl 的 Ruby On Rails 教程时,在作者编写集成测试以验证他的注册页面的部分中,他使用了下面的代码 spinet。我明白了代码的作用,但无法理解“如何”部分,即无法理解执行顺序。

expect { click_button "Create my account" }.not_to change(User, :count)

有人可以解释一下上述方法链和 block 的语义以及它们是如何组合在一起的吗?

最佳答案

您将使用 expect ... change 来验证特定方法调用是否更改或不更改其他值。在这种情况下:

expect { click_button "Create my account" }.not_to change(User, :count)

将导致 rspec 执行以下操作:

  1. 运行 User.count 并记下返回的值。 (这可以指定为接收器和方法名称,如示例中的 (User, :count) ,或指定为任意代码块,如 { User.count } }.
  2. 运行 click_button "Create my account",这是一种模拟鼠标点击链接的 Capybara 方法。
  3. 再次运行 User.count
  4. 比较 #1 和 #3 的结果。如果它们不同,则示例失败。如果它们相同,则通过。

使用expect ... change的其他方法:

expect { thing.destroy }.to change(Thing, :count).from(1).to(0)
expect { thing.tax = 5 }.to change { thing.total_price }.by(5)
expect { thing.save! }.to raise_error
expect { thing.symbolize_name }.to change { thing.name }.from(String).to(Symbol)

一些文档是 here .

它是如何做到这一点的有点神秘,完全没有必要为了使用它而了解它的工作原理。对 expect 的调用正在为 rspec 定义要执行的结构,使用 rspec 自己的自定义 DSL 和“匹配器”系统。加里伯恩哈特有一个相当整洁的 screencast他在其中争辩说,rspec 的奥秘实际上从像 ruby​​ 这样的动态语言中自然而然地消失了。这不是使用 rspec 的很好介绍,但如果您对它的工作原理感到好奇,您可能会发现它很有趣。

更新

在看到您对另一个答案的评论后,我将添加一些有关操作顺序的信息。不直观的技巧是它是执行所有 block 的 matcher(在本例中为 change)。 expect 有一个 lambda,not_toshould_not 的别名,它的工作是将 lambda 传递给匹配器。这种情况下的匹配器是 change,它知道执行一次自己的参数,然后执行传递给它的 lambda(来自 expect),然后运行自己的参数再次查看是否有变化。这很棘手,因为该行看起来应该从左到右执行,但由于大多数片段只是传递代码块,所以它们可以并且确实将它们打乱成对匹配器最有意义的任何顺序。

我不是 rspec 内部的专家,但这是我对基本思想的理解。

关于ruby-on-rails - RSpec 的期望如何在 ROR 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645590/

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