簡體   English   中英

使用 Rspec 進行 Rails 控制器測試

[英]Rails controller test with Rspec

我試圖通過制作經常共享的部分html.erb文件來組織代碼(例如_form.html.erb

我想檢查我的部分代碼是否適用於不同的模型/控制器,所以我從視圖中手動執行 CRUD。

使用Rspec自動測試我的代碼會更好,但我不知道。 誰能給我一些指導如何使用Rspec測試控制器代碼?

要一起測試控制器和視圖,您需要編寫功能規范請求規范

請求規范是較低級別的規范,您可以在其中向應用程序發送 HTTP 請求並編寫關於響應的期望(也就是 TDD 行話中的斷言)。 它們是ActionDispatch::IntegrationTest的包裝器。 請求規范應該被視為控制器規范的替代品,RSpec 和 Rails 團隊不鼓勵使用控制器規范。

# spec/requests/products_spec.rb
require 'rails_helper'
RSpec.describe "Products", type: :request do
  describe "GET /products" do
     let!(:products) { FactoryBot.create_list(:product, 4) }
     it "contains the product names" do
        get "/products"
        expect(response).to include products.first.name
        expect(response).to include products.last.name
     end
  end
end

功能規范是專注於用戶故事的更高級別的規范。 它們通常用作驗收測試。 他們使用名為 Capybara 的瀏覽器模擬器來模擬用戶點擊應用程序的方式。 Capybara 還可以通過 selenium 運行無頭瀏覽器(無頭 chrome、firefox、phantom js、webkit 等)和“真實”瀏覽器。 minitest 等價物是ActionDispatch::SystemTestCase但 RSpec 功能沒有包裝它(minitest/testunit 花了幾年時間才趕上這里)。

# Gemfile
gem 'capybara'
# spec/features/products_spec.rb
require 'rails_helper'
RSpec.feature "Products" do
  let!(:products) { FactoryBot.create_list(:product, 4) }

  scenario "when a user views a product" do
    visit '/'
    click_link 'Products'
    click_link products.first.name
    expect(page).to have_content products.first.name
    expect(page).to have_content products.first.description
  end
end

此規范測試 products#index 和 products#show 操作以及根頁面和相關視圖。

這兩種規格都有其優點和缺點。 功能測試適用於測試大量應用程序,但很繁重。 請求規范更快,更容易復制導致錯誤/問題的特定請求,但您基本上只是將 HTML 與非常有限的正則表達式匹配。

檢查部分代碼是否適用於不同的模型/控制器。 您可以在控制器規范中添加render_views

如何使用 Rspec 測試控制器代碼? 閱讀官方文檔https://relishapp.com/rspec/rspec-rails/docs/controller-specs

這個頁面可能會有所幫助: https : //thoughtbot.com/blog/how-we-test-rails-applications

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM