RSpec-Rails (基礎篇)(7): 撰寫整合測試
單元測試(Unit test)和整合測試(Integration test)的差異。
- 單元測試針對程式的各個最小單位進行測試,在Rails當中通常測試的最小單位是method,要確保每一個method的內容都可以順利進行。尤其抓錯字在unit test中非常重要!可以省下非常多時間!(本人親身經歷)
- 整合測試主要是看大方向,通常直接從網址進行GET或帶入變數,確保回傳的結果是正確無誤的。
- 兩種測試一樣重要,如果只有單元測試,我們很容易忽略掉每個class之間互動可能發生的問題。
- 如果只有整合測試,那發生錯誤的時候會很難抓問題出在哪,難度就跟我們直接下去開瀏覽器測試一樣,實用性較低。
spec/requests/posts_spec.rb
require "rails_helper"
RSpec.describe "posts", :type => :request do
before(:all) do
@post = Post.create(:title => "post from request spec")
end
it "#index" do
get "/posts"
expect(response).to have_http_status(200)
expect(response).to render_template(:index)
expect(response.body).to include("Title")
expect(response.body).to include("Content")
expect(response.body).to include("post from request spec")
end
it "#show" do
get "/posts/#{@post.id}"
expect(response).to have_http_status(200)
expect(response).to render_template(:show)
expect(response.body).to include("Title:")
expect(response.body).to include("Content:")
expect(response.body).to include("post from request spec")
end
it "#create" do
params = {title: "create title", content: "create content"}
post "/posts", post: params
expect(response).to have_http_status(302)
expect(Post.last.title).to eq(params[:title])
end
end