2016-05-08 29 views
1

我仍然是一個新手,我很難過:我有一個'find_by'語句在生產環境中執行時可以正常工作,但它失敗在測試期間,就我所能確定的而言,是相同的輸入。Rails:find_by在測試中失敗,在生產中工作

我有一個非常簡單的表格,由seeds.rb填充如下:

Nonprofit.create!(id: 1, name: "Nonprofit number 1") 
Nonprofit.create!(id: 2, name: "Nonprofit number 2") 

在我的會話控制器,我有以下兩個語句:

puts "=======>" + params[:nonprofit_id] + "<==============" 
nonprofit = Nonprofit.find_by(id: params[nonprofit_id]) 
puts "=======>" + nonprofit.name + "<==============" 

在生產環境中,日誌顯示:

Processing by SessionsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"Mm7qVchebMORY5QBOlvl1ac69m1ACwttXcE71LbfHnHH2RqpB6mSP+wFxodop/9Mgv/NlLO9V9NVEcTU1a54tw==", "session"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "nonprofit_id"=>"1", "commit"=>"Log in"} 
==================>>>1<========= 
    Nonprofit Load (0.3ms) SELECT `nonprofits`.* FROM `nonprofits` WHERE `nonprofits`.`id` = 1 LIMIT 1 
==================>>> Nonprofit number 1 

換句話說,ActiveRecord查找正確的表使用id值爲1的條目。

來自測試運行的日誌顯示與'puts'完全相同的輸出,但隨後在第二個'puts'中出錯,因爲(大概)find_by找不到記錄。這裏的日誌從試運行:

運行:

================== >>> 1 < ========= E

以0.467105s,2.1408sun/s,0.0000斷言/ s完成。

1)錯誤: UsersIndexTest#test_index_as_non管理員: NoMethodError:未定義的方法name' for nil:NilClass app/controllers/sessions_controller.rb:14:in創建 ' 測試/ test_helper.rb中:19:在log_in_as' test/integration/users_index_test.rb:29:in塊'

任何想法/建議?或者(或另外)我怎樣才能使測試運行日誌顯示活動記錄查詢,如生產運行的日誌顯示?

謝謝!

回答

1

由於Rails不會將seed.rb加載到測試數據庫中,因此您的測試找不到您要查找的記錄。

你應該使用FactoryGirl,Fixtures或者只是在before(:each)塊中創建記錄。任何Rails測試教程都會對Fixtures,FactoryGirl或其他一些將數據導入測試的方式有所瞭解。 This may be a good way to start.

或者,如果您確實需要將seeds.rb中的內容加載到測試數據庫中,則可以嘗試doing this

1

Rails適用於不同的環境。在測試你的測試環境時(測試)。在本地運行應用程序(使用rails server)時,您處於開發環境。在服務器上運行時,應該在生產環境中運行。

每個環境都有自己的數據庫。我想你運行'rake db:seed'並認爲它會填充你的測試數據庫,但這不是真的。這就是爲什麼它沒有找到記錄 - 在測試數據庫上它不存在。

正如@pggaspar指出的那樣,您應該使用工廠或固定裝置來填充測試數據庫。

+0

明白了 - 謝謝......令人困惑的是,我在我的裝置中輸入了條目,但沒有包含ID字段。補充說,它工作。 –

相關問題