2011-08-30 9 views
0
내 기능 시험, 시험/기능/cust_infos_controller_test.rb에서 레일 (3)와 응용 프로그램을 쓰고 있어요

, 나는이 있습니다레일 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 

내가 잘못을 다음있어 또는 :

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가 있습니다. 하지만 컨트롤러 테스트를 실행하여 레코드를 얻는 이유는 무엇인지 모릅니다. 활성 레코드는 insert 문을 실행합니다. 이 문제를 어떻게 해결할 수 있습니까?

업데이트 : customerinfo 메서드의 모든 줄을 주석 처리하고 같은 테스트를 실행했습니다. 정확한 결과를 얻었다. 그래서 나는 그것을 내 방식의 행동이 아니라 Rails라고 추측하고 있습니까? 어떤 힌트?

+0

고객 정보를 게시 할 수 있습니까? –

+0

방금 ​​게시했습니다. 모든 고객을 찾기 위해 activerecord를 사용합니다. 그게 전부입니다. 보기에 결과가 표시됩니다. – swingfuture

답변

0

나는 무엇을 하려는지보고 있습니다. 당신이해야 할 일은 당신의 견해를 도우미를 만드는 것입니다.

application_helper.rb 당신이 upload_freq를 사용 dislay_upload_freq (ci.upload_freq)에 대해, @cust_info을 반복하는보기에

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

그런

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

cust_info_controller.rb. 당신이 @ cust_info.each do | ci |를 가지고 있다고 가정하십시오. 그렇다면 DB를 저장하는 것과 혼동하지 마십시오.

+0

나는이 속성을 db에있는 것과 다르게 표시하려고했습니다. DB를 변경할 필요가 없기 때문에 저장하지 않았습니다. 나는 이것을 할 수있는 다른 모델을 만들 수 있었다고 생각한다. 그러나 그것이 하나의 속성이라고 생각했습니다. – swingfuture

+0

요구 사항에 대한 대답이 변경되었습니다. =) –

+0

확인. 그것은 그것을하는 좋은 방법입니다.그것은 여전히 ​​내가 가진 테스트 문제를 해결하지 못했지만. – swingfuture

0

테스트 데이터를 생성하기 위해 공장이나 설비를 사용하고 있습니까? 그렇지 않다면 어떻게 작성하고 있습니까? 내 생각 엔 테스트 데이터가 설정 될 때 인서트가 일어나고 컨트롤러에서 일어나는 일이 일어나지 않기 때문입니다. 그 추측의 두 번째 부분은 컨트롤러의 모든 코드를 주석 처리하는 것이 오류를 제거하지 않는다는 사실에 의해 뒷받침됩니다.

0

나는이 게시물이 꽤 오래된 것을 알고 있지만 누군가가 검색 엔진에 의해 여기로 데려온 경우를 대비하여 내 대답을 게시 할 것입니다. 정확히 똑같은 문제가 있었지만이 문제는 test/fixtures/{name_of_your_model} .yml에있는 조명기 파일에서 발생했습니다.

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

을하고 테스트를 실행하고자 할 때,이기구를 사용하여 테스트 데이터베이스를 만들려고합니다 : 레일이 파일에 일부 초기 값을 추가, 내 경우에이처럼 보였다. 그리고 그것이 문제가 발생하는 곳입니다. 테이블에 null ID를 허용하지 않는 동안 빈 레코드를 만들려고합니다.

이러한 조명기를 삭제하거나 적절한 값으로 채우면 문제가 해결됩니다.