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 了。

results matching ""

    No results matching ""