One assertion per test 原則
在寫測試的時候,有一個測試的黃金原則:One assertion per test,也就是一個測試一次只測一件事。 你可以注意到,1-1 的測試好像違反這個原則,一個測試裡面好像測了很多件事?
require "rails_helper"
RSpec.describe CoursesController, type: :controller do
describe "GET index" do
it "assigns @courses and render template" do
course1 = create(:course)
course2 = create(:course)
get :index
expect(assigns[:courses]).to eq([course1, course2])
expect(response).to render_template("index")
end
end
end
所以我們應該要把這個測試拆開,具體方向是把 assign 與 render view 拆開。
require "rails_helper"
RSpec.describe CoursesController, type: :controller do
describe "GET index" do
it "assigns @courses and render" do
course1 = create(:course)
course2 = create(:course)
get :index
expect(assigns[:courses]).to eq([course1, course2])
end
it "render template" do
course1 = create(:course)
course2 = create(:course)
get :index
expect(response).to render_template("index")
end
end
end
再跑一次 rspec spec/controllers/courses_controller_spec.rb
,確認我們剛剛的改動沒有問題。
豆知識
- 什麼時候建議要拆開 Test?通常是在你發現自己 test 的敘述裡面有了
and
這個字,這時候就有必要拆開 test 了。