我遇到了在我的Rails 3.2.8應用程序中測試自定義發佈操作的問題。我認爲這與事務性設置被設置爲true有關,但可以通過一些幫助診斷。測試自定義發佈操作事務問題
我有這個在我的spec_helper.rb
config.use_transactional_fixtures = true
我的控制器的規格如下所示:
require 'spec_helper'
describe Api::V1::NasController do
login_user
describe "GET #nas" do
it "posts to startup as new (state) controller" do
@location = FactoryGirl.create(:location_full)
@location.users << @current_user
nas = FactoryGirl.create(:nas, location_id: @location.id)
nas.update_attributes!(:state => 'initialised')
post :start_up, :token => nas.token, :key => nas.key
response.should be_success
end
end
end
我可以看到發生的事情後,我的服務器日誌但是測試失敗:
1) Api::V1::NasController GET #nas posts to startup as new (state) controller
Failure/Error: post :start_up, :token => @nas.token, :key => @nas.key
NoMethodError:
undefined method `slice' for nil:NilClass
# ./app/helpers/nas_helper.rb:26:in `queue'
# ./app/controllers/api/v1/nas_controller.rb:99:in `start_up'
# ./spec/controllers/api/v1/nas_controller_spec.rb:16:in `block (3 levels) in <top (required)>'
我有一個在我的控制器中的過濾器,它採用令牌和密鑰,並給頭unau如果找不到Nas,就會受到懲罰。
在這個測試中,NAS實際上是發現並將其移動到控制器的動作:
def start_up
@token = params[:token]
@nas = Nas.find_by_token("#{@token}")
if @nas
[ do some stuff ]
....
NasSync.enqueue(@nas)
...
end
它的失敗在NasSync.enqueue(@nas)依次調用下面的輔助方法(從resque工人,我省略):
def self.queue(nas)
node = Nas.find(nas.id).nasname.slice(0..3)
.....
end
在「真實」的世界裏,我可以成功發佈到這個網址 - 它只是在測試環境中,它失敗。
node = Nas.find(nas.id).nasname.slice(0..3)
找不到Nas切片。
我不明白爲什麼它找不到Nas,如果它到目前爲止沒有失敗。如果我硬編碼節點,測試通過。
是否有一個特定的原因,爲什麼沒有發送給助手的nas?
任何建議/幫助表示讚賞。
- 更新 -
我關掉事務燈具,整理所剩下的,現在還在堅持錯誤的爛攤子:
undefined method `slice' for nil:NilClass
我想這是因爲你的燈具都是事務性的。所以它找不到Nas。 –
是的,它不應該在交易中包裝整個測試嗎?我改變了假,但我得到約150失敗。是否最好這樣做,並使用數據庫清理器來排序數據庫? – simonmorley
我更喜歡非事務性測試。它爲我提供了一些真實的背景。 –