2017-05-25 88 views
1

在我的Ruby on Rails 4.2應用程序中,我想更改一個測試檢查內聯樣式到rspec 3更近期的「期望」上的「應該」,但我得到一個錯誤。Rspec /水豚 - 更改應該預期

當我使用下面的測試,我測試通過:

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
expect(find('#zone')['style']).to eq "background-image...." 

一般來說,something.should ==相當於在使用委託方法,或者實現方法,如should自己的對象寫expect(something).to eq

有一些細微的差別(「漏洞修復」,如果你喜歡);但大多數情況下我不會爲此擔心;您可以考慮這兩種格式相同,但應始終致力於使用新格式expect

另一個很好的轉換是,如果你編寫的測試使用(有時隱式定義)subject變量 - 例如, subject.should ...,你可以重新寫爲兩種:expect(subject).to,或者只是:is_expected.to

+0

感謝您的回答,對我幫助很大 – Mathieu

2

雖然接受的答案是技術上是正確的,它可能會導致片狀的測試,如果你有一個動態的頁面。當檢查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;"]') 
+0

感謝由我從來沒有見過這種match_css方式的尖端和其他信息 – Mathieu

+0

,是have_css有什麼不同? – Mathieu

+2

@Mathieu'have_css'將查找當前範圍元素的匹配後代元素,'match_css'檢查當前範圍元素是否與傳遞的css選擇器匹配 –