跳到主要內容

發表文章

目前顯示的是 五月, 2017的文章

在 RSpec 裡測試 Rake Task

最近被 Rake Task 的測試設定搞得一頭霧水,簡單記錄一下測試 Rake Task 的測試設定,以及各種鬼打牆的血淚史:
TL;DR為了避免各種 task 載入、執行狀態等相互干擾導致 test case 會偶發性失敗,每一次執行 test case 時就去做「載入」、「卸載」會比較沒有鬼打牆狀況出現。# spec_helper.rb config.before(:each, rake: true) do Rails.application.load_tasks end config.before(:each, rake: true) do Rake::Task.clear end 把 Rails.application.load_tasks 放在 before(:each) 確保每次載入 test case 前都有正確 load 到要測試的那隻 task ,並在 after(:each) 時用 Rake::Task.clear 去清空剛剛載入的 Rake Task。透過 rake: true 這個 flag 可以避免其他不相關的單元測試也去載入 Rake Task。透過每個 each 都做載入跟卸載 Rake Task 後,就可以在 test case 單純使用 Rake::Task['task_name'].invoke 來手動執行 Task 而不用另外去作載入或卸載。# spec/lib/tasks/example_task_spec.rb require 'rake' describe 'example_task test', rake: true do ... it 'does something' do Rake::Task['example_task'].invoke expect(result).to eq(something) end end 血淚史之所以最後還是決定要每次 test case 就去載入,實在是因為太常出現鬼打牆的狀況了:單一檔案裡 Rake::Task 只能被 invoke 一次有多個需要 invoke 的 task 時就會有些 example 沒能成功執行 task之前寫 Rak…