Rspec / Capybara - 改变应该达到预期

时间:2017-05-25 22:38:22

标签: ruby-on-rails ruby ruby-on-rails-4 rspec capybara

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

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

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

我试图将它转换为rspec更近期的“期待”

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

但是我收到了这个错误:

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

如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

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

通常,something.should ==相当于撰写expect(something).to eq

对于使用委托方法的对象,或者自己实现should等方法,存在一些细微差别(&#34;错误修复&#34;,如果您愿意);但在大多数情况下,我不担心;您可以考虑两种格式等效,但应始终使用新的expect格式。

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

答案 1 :(得分:2)

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

会好得多
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;"]')