RSpec-Rails (基礎篇)(7): 撰寫整合測試

RSpec-Rails教學(基礎篇)全部內容

單元測試(Unit test)和整合測試(Integration test)的差異。

  1. 單元測試針對程式的各個最小單位進行測試,在Rails當中通常測試的最小單位是method,要確保每一個method的內容都可以順利進行。尤其抓錯字在unit test中非常重要!可以省下非常多時間!(本人親身經歷)
  2. 整合測試主要是看大方向,通常直接從網址進行GET或帶入變數,確保回傳的結果是正確無誤的。
  3. 兩種測試一樣重要,如果只有單元測試,我們很容易忽略掉每個class之間互動可能發生的問題。
  4. 如果只有整合測試,那發生錯誤的時候會很難抓問題出在哪,難度就跟我們直接下去開瀏覽器測試一樣,實用性較低。

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