2012-11-12 46 views
0

我遇到了在我的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 
+1

我想這是因爲你的燈具都是事務性的。所以它找不到Nas。 –

+0

是的,它不應該在交易中包裝整個測試嗎?我改變了假,但我得到約150失敗。是否最好這樣做,並使用數據庫清理器來排序數據庫? – simonmorley

+0

我更喜歡非事務性測試。它爲我提供了一些真實的背景。 –

回答

0

雖然它本來就不是事務性燈具直接導致問題,最終引發問題。這實際上是我的代碼中的一個小錯誤。

交易過程中的生活很簡單,直截了當,可能相當盲目。事情通過,當他們可能不應該

關閉意味着我需要廢棄我凌亂的種子,並創建數據,當我需要它。

懶惰的編碼導致頭痛和更多的工作。

我現在也意識到,人們應該對自己的能力有更多的信心,並相信已經寫好的測試。在這種情況下,這個小小的bug可能會導致一些大問題。花了3天的時間。