2016-07-28 91 views
0

我最近建立了一個功能規格內部「規格/功能」,並在功能規範的中間,我決定嘗試這樣做合併功能和請求規格是否支持rspec行爲?

context "foo", type: :request do 
    it "works" do 
    get some_path 
    expect(response.body).to eq("something") 
    visit some_path 
    expect(page).to have_content("something") 
    end 
end 

令我驚訝的是,它實際工作。通常在功能規格中,您無法調用get,post等方法,並且在請求規範中不能調用方法爲水豚visit。它也適用於其他方式。如果我在「規範/請求」內的請求規範中,我可以使用:feature來標記事物並獲得相同的行爲。

這是否支持rspec行爲?我知道這可能會帶來設計/概念上的問題,但是在混合這兩者方面存在技術缺陷嗎?

回答

1

爲什麼我們現在知道的功能規格和請求規格被分解到單獨的目錄中,請參見this blog post

綜上所述,儘管拆分出來在水豚2.0做緩解具有單種規格的混亂,request規範,負責執行全棧集成測試以及高級別規格這將僅使用其外部接口來驅動應用程序(通常通過無頭網絡瀏覽器完成)。因此,規範的電流一般約定的結構將是:

  • 將任何使用水豚DSL(visit等),以在spec/features
  • 將全棧非控制器規格一個page對象上斷言使用機架DSL(get等),以在spec/requests

一個response對象斷言這也許最好不要合作打成一片兩個如果可以的話,即使它是可能的,如果沒有其他原因,而不是保持與慣例並給你未來的同事你沒有什麼驚喜。


至於爲什麼你可以,如果你想合作打成一片的規格,它主要是使用RSpec配置做的,所以它支持的行爲:

  • 你可能也行config.infer_spec_type_from_file_location!rails_helper.rb的地方,這意味着RSpec的會考慮任何文件spec/features是功能規格和任何文件spec/requests是請求規範
  • 因此,即使你換一個各地在spec/features文件夾中的規範標誌,因而令到機架DSL是單一規格的訪問,這將仍然有機會獲得水豚DSL

你甚至可以使用RSpec.config,使水豚DSL到任何規範類或目錄的路徑,你想要的,雖然這是not recommended

RSpec.configure do |config| 
    config.include Capybara::DSL, type: :request 
    config.include Capybara::DSL, file_path: %r{spec/requests} 
end 

總體來說,對你的代碼的緣故,未來的你,和你的未來的同事,它可能是最好的嘗試,並把一切都在其正確的地方。

+0

感謝您的好消息。 – CodeSmith