2011-08-30 185 views
0

我正在寫使用Rails 3應用程序在我的功能測試,測試/功能/ cust_infos_controller_test.rb,我有這些:的Rails 3控制器測試

require 'test_helper' 

class CustInfosControllerTest < ActionController::TestCase 
    # Replace this with your real tests. 
    test "should get cust" do 
    get :customerinfo 
    assert_response :success 
    assert_not_nil assigns("cust_infos") 
    end 
end 

我的控制器是非常簡單的,因爲它只是發現客戶的所有信息:

class CustInfosController < ApplicationController 
    def customerinfo 
    @cust_info = CustInfo.find(:all, :order=>"cust_id") 
    @cust_info.each do |ci|            
     if ci.upload_freq == 'W' 
     ci.upload_freq = 'Weekly' 
     elsif ci.upload_freq == 'M' 
     ci.upload_freq = 'Monthly' 
     end 
    end 
    end 
end 

當我運行它:

$ ruby -Itest test/functional/cust_infos_controller_test.rb 

我得到了以下ERR或:

Loaded suite test/functional/cust_infos_controller_test 
Started 
E 
Finished in 0.025258 seconds. 

1) Error: 
test_should_get_cust(CustInfosControllerTest): 
ActiveRecord::StatementInvalid: PGError: ERROR: numeric field overflow 
DETAIL: A field with precision 4, scale 0 must round to an absolute value less than 10^4. 

: INSERT INTO "cust_infos" ("cust_id") VALUES (298486374) 


1 tests, 0 assertions, 0 failures, 1 errors 

在我cust_infos表,我已經CUST_ID爲整數。但是我不知道爲什麼當我運行控制器測試來獲取一些記錄時,活動記錄會執行插入語句。我該如何解決?

更新:我註釋掉了customerinfo方法中的所有行,並運行相同的測試。得到完全相同的結果。所以我猜這不是我的方法行爲,而是Rails?任何提示?

+0

您可以發佈您的customerinfo方法嗎? –

+0

我剛發佈了它。它使用activerecord查找所有客戶。就是這樣。視圖將顯示結果。 – swingfuture

回答

0

我明白你在做什麼。你需要做的是爲你的觀點創建一個幫手。

application_helper.rb

def display_upload_freq(s) 
    case s 
    when 'W' 
    'Weekly' 
    when 'M' 
    'Monthly' 
    end 
end 

cust_info_controller.rb

class CustInfosController < ApplicationController 
    def customerinfo 
    @cust_info = CustInfo.find(:all, :order=>"cust_id") 
    end 
end 

然後在您的視圖時,您將可以通過@cust_info迭代,對於upload_freq,使用dislay_upload_freq(ci.upload_freq)。假設你有@ cust_info.each do | ci |。然後,你不會混淆數據庫和保存任何東西。

+0

我試圖顯示這個屬性與db中的屬性不同。我沒有保存它,因爲數據庫不需要更改。我想我可以建立另一個模型來做到這一點。但認爲這只是一個屬性。 – swingfuture

+0

更改了滿足您需求的答案。 =) –

+0

好的。這是一個很好的做法。雖然它仍然沒有解決我的測試問題。 – swingfuture

0

您是否使用工廠或燈具來創建測試數據?如果不是,你是如何創建它的?我的猜測是插入是在您設置測試數據時發生的,而不是因爲您的控制器發生任何事情。這一猜測的第二部分是由於註釋掉控制器中的所有代碼沒有擺脫錯誤這一事實。

0

我知道這篇文章是相當古老的,但我會張貼我的答案,以防有人被搜索引擎帶到這裏。 我有完全相同的問題,問題來自test/fixtures/{name_of_your_model} .yml中的夾具文件。 Rails添加在這個文件中的一些初始值,在我的情況是這樣的:

one: {} 
# column: value 
# 
two: {} 
# column: value 

,當你想運行測試,它會嘗試創建一個使用這種燈具的測試數據庫。這就是問題發生的地方。試圖創建一個空記錄,而您不允許您的表中有空ID。

刪除這些燈具或填充適當的值應該可以解決問題。