- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在阅读 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 执行以下操作:
User.count
并记下返回的值。 (这可以指定为接收器和方法名称,如示例中的 (User, :count)
,或指定为任意代码块,如 { User.count } }
.click_button "Create my account"
,这是一种模拟鼠标点击链接的 Capybara 方法。User.count
。使用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_to
是 should_not
的别名,它的工作是将 lambda 传递给匹配器。这种情况下的匹配器是 change
,它知道执行一次自己的参数,然后执行传递给它的 lambda(来自 expect
),然后运行自己的参数再次查看是否有变化。这很棘手,因为该行看起来应该从左到右执行,但由于大多数片段只是传递代码块,所以它们可以并且确实将它们打乱成对匹配器最有意义的任何顺序。
我不是 rspec 内部的专家,但这是我对基本思想的理解。
关于ruby-on-rails - RSpec 的期望如何在 ROR 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645590/
我想知道 Rspec 中的命令式和声明式步骤是什么。 这是 Rspec 书中的示例代码: Scenario: transfer money (declarative) Given I have $10
我正在尝试使用 Travis 设置 CI。但是我遇到了在 Travis 上失败但在本地没有的测试,甚至提供了相同的种子。 我认为种子运行相同,但现在我不确定,并想弄清楚它是否存在,所以我现在在哪里看。
RSpec 的文档提到了 --bisect option ,当运行时提供最小的复制,例如 rspec ./spec/calculator_10_spec.rb[1:1] ./spec/calculat
我有一些昂贵的测试设置,仅对我的规范中的少数示例是必需的,如果需要,它只需要运行一次。因为它很慢,所以我试图避免将它放在 before(:each) block 中,但 before(:all) 似乎
在我的 Gemfile 中 gem 'rspec-rails', '~> 3.3' 我发现,errors_on 匹配器移动到了另一个 gem:https://github.com/rspec/rspe
如果我运行此命令“rspec ./spec/requests/api/v1/password_reset_request_spec.rb”,此文件中的所有测试都会通过。 但是,当我运行“rspec”时
我花了 4 天时间尝试正确安装 Ruby on Rails,但我遇到了一个大问题。我第一次使用Linux(对我来说更舒服),但遇到问题后,我使用了Windows。令我惊讶的是,我在 Windows 上
我在这样的验证中测试了很多坏字符串: ['0', '3:a', 'xx:11', '-1', '-3:00', 'h', 'h2', 'h2h', 'm', 'm10', 'm10m', '2hm',
我的测试套件中有一部分运行着一堆非常慢的导入器。这些测试不需要经常运行(除非实际上正在处理导入器)所以我使用 Rspec 标签将它们分开:http://relishapp.com/rspec/rspe
Rspec 尝试在运行任何规范文件或整个测试套件结束时运行 Test::Unit 测试。它仍然没关系,因为我没有任何测试单元测试文件,但它尝试传递给 rspec 的命令行选项,因为它们将传递给 Tes
我有一段代码要测试: class User :destroy end 请举例测试关联代码的RSpec代码。 最佳答案 对我来说,这个变体效果很好: describe User do it { s
我正在尝试在 rails Controller 规范中重用一些通用代码。我对管理员用户和普通用户有不同的上下文。但是,对于特定操作,大部分行为是相同的,因此我尝试将这种常见行为提取到辅助函数中: de
我有两个类OneClass和 AnotherClass : class OneClass def initialize(*args) @another_member = AnotherCl
我有一个看起来像这样的模型: class Gist def self.create(options) post_response = Faraday.post do |request|
我是 RSPEC 的新手。我编写了一个名为 result_spec.rb 的 RSPEC 代码,如下所示: describe '#grouped_scores' do subject { result
我对字符串类进行了如下扩展: class String def last_character self[-1] end end 我将 string.rb 文件放在 lib 中,如下所示
我是 RSpec 的新手,我在其中编写了一个测试场景: my_object.should_not be_valid 它工作正常。但是,我想测试模型的特定属性是否无效。这样的 RSpec 行为是现成的吗
我正在尝试测试邮政编码属性的长度以确保其长度为 5 个字符。现在我正在测试以确保它不是空白,然后是 4 个字符太短,6 个字符太长。 有没有办法测试它是否正好是 5 个字符?到目前为止,我在网上或 r
我将rspec与电子邮件规范gem一起使用。我正在尝试做: last_delivery = ActionMailer::Base.deliveries.last last_delivery.body.
我创建了一个新的 rails 应用程序,并按照此处的 rspec-rails 安装说明进行操作 - https://github.com/rspec/rspec-rails然后我在我的 app/lib
我是一名优秀的程序员,十分优秀!