2014-05-12 23 views
0

rspec的所有教程都使用內置匹配器,但我沒有看到給予學習新語法成本的好處。例如,這兩個是等效的:rspec matcher與香草紅寶石有什麼好處?

expect(person.name).to eq "John" 
person.name.should == "John" 

至少eq是容易記住的事情。 rpsec涉及許多「異國情調」的東西,如have(n).things。爲什麼我不應該用普通紅寶石代替object.size.should == n

總之,學習所有這些rspec匹配器相比使用.should ==有什麼好處?

+0

這個問題似乎可能有點寬泛和基於觀點,但是一個簡單的答案是rspec可以爲應用程序創建一個更加自然的規範,我認爲DHH自己說過[對rspec沒有太多需要或黃瓜](http://www.rubyinside.com/dhh-offended-by-rspec-debate-4610.html)但這是他的意見,該文章顯示了幾個不同的觀點,你可以用它來熟悉自己的論點贊成/反對。 –

回答

1

.should香草紅寶石 - 它是rspec的就像expect ...

rspecintroducedexpect語法,因爲在should方法固有的需要注意的地方:

委派問題method_missing,BasicObject和標準庫的代表之間,ruby擁有非常豐富的工具來構建 委託或代理對象。不幸的是,當RSpec的should語法(如 )的語法優雅時,在測試委託/代理對象時很容易產生奇怪的,令人困惑的錯誤 。

Rspec的API準則是有測試閱讀,如英語,這就是爲什麼他們的語法,如:

object.should have(5).elements 

或用新的語法

expect(object).to have(5).elements 

這意味着你「預期對象有5個元素「,而不必與這個解釋相同

object.size.should == n 
+0

所以好處就是擁有更多類似英語的語法? '.should =='可以完成像'eq'和'have(n).things'這樣的內建匹配器可以完成的任何事情嗎? – Heisenberg

+2

這不是我說的。就像代碼中的任何東西一樣,有一種方法去皮膚貓,但將自己限制爲'.should =='聽起來很愚蠢 - 你會如何期待{save_new} .to改變(saved_items,:size).by(1 )'? –