Rspec/Capybara - 将 should 改为 expect

Rspec/Capybara - change should into expect

在我的 Ruby on Rails 4.2 应用程序中,我想将测试检查内联样式更改为 rspec 3 最近的 "expect" "should" 但我得到一个错误。

当我使用下面的测试时,我的测试通过了:

find('#zone')['style'].should == "background-image: url(xxxxx); background-size: cover;"

我尝试将其转换为 rspec 更新的 "expect"

expect('#zone')['style'].to eq("background-image: url(xxxxx); background-size: cover;")

但我得到这个错误:

undefined method `[]' for #<RSpec::Expectations::ExpectationTarget:0x00000008578840>

如何实现?

expect(find('#zone')['style']).to eq "background-image...."

一般来说,something.should ==相当于写作expect(something).to eq

在使用委托方法的对象或自己实现 should 等方法的对象上存在一些细微差别("bug fixes",如果您愿意的话);但在大多数情况下,我不会为此担心;您可以认为这两种格式是等效的,但应始终以使用新的 expect 格式为目标。

另一个不错的转换是,如果您编写的测试使用(有时 隐式 定义)subject 变量 - 例如subject.should ...,您可以将其重写为:expect(subject).to,或者只是:is_expected.to

虽然接受的答案在技术上是正确的,但如果您有动态页面,它可能会导致不稳定的测试。当正在检查 style 属性的元素由于 JS 操作而被更新时,可能会发生这种情况,并且检查可能会在样式更改之前发生。把期望写成

会好很多
expect(page).to have_css('#zone[style="background-image: url(xxxxx); background-size: cover;"]')

expect(find('#zone')).to match_css('[style="background-image: url(xxxxx); background-size: cover;"]')