복붙노트

[RUBY-ON-RAILS] 레일 : 부울의 유효성 검사 포함은 테스트를 실패

RUBY-ON-RAILS

레일 : 부울의 유효성 검사 포함은 테스트를 실패

나는 나의 모델의 필드가 부울 있는지 확인하기 위해 노력하고있어,하지만 내 테스트는 실패에 계속.

RSpec에와 레일이 레일에 부울 값 유효성 검사 :이 읽고 나면 내가 어떻게 그 일이 부울입니다 확인합니까? 그래서 같이 그 일을 결국 :

class Model < ActiveRecord::Base

  validates :my_field, :inclusion => { :in => [true, false] }

end

나는 (RSpec에와 했어야 매처 (matcher)를 사용하여)이 몇 가지 방법을 테스트 해봤 내 시험 실패에 계속 있기 때문에, 지금은 아래로 멍청한 가능 (?) 방식입니다. 그럼에도 불구하고, 시험은 통과하지 못한 나는 값 어딘가에 변환 몇 가지 메커니즘이 있다고 추측하고있다.

저는 여기에 무슨 일이 일어나고 있는지 알아 내기 위하여 사용하고있는 작업은 다음과 같습니다

# create instance without setting value ...

# these work as expected
model_instance.valid?.should be_false      # passes
model_instance.my_field = true
model_instance.valid?.should be_true       # passes
model_instance.my_field = false       
model_instance.valid?.should be_true       # passes

# works as expected
model_instance.my_field = ""
model_instance.valid?.should be_false      # passes

# these should pass but fail
model_instance.my_field = "foo"
model_instance.my_field.should == "foo"    # fails as well, my_field == false
model_instance.valid?.should be_false      # fails

model_instance.my_field = "false"
model_instance.my_field.should == "false"  # fails as well, my_field == false
model_instance.valid?.should be_false      # fails

model_instance.my_field = "123"
model_instance.valid?.should be_false      # fails

model_instance.my_field = "true"
model_instance.my_field.should == "true"   # fails as well, my_field == true
model_instance.valid?.should be_false      # fails

나는 무엇을 놓치고? 값은 다소 논리적 인 방식으로 변환된다 보이지만 어디서 어떻게 그것을 방지하기 위해? 어떻게 제대로 검증이 종류를 할까?

해결법

  1. ==============================

    1.이 밈이 아닌 경우를 true / false가 같은 부울 필드를 검증 할 필요가 있다는이 아이디어는 어디에서 왔는지 모르겠어요,하지만 난 궁금해 시작 해요 그래서 최근 몇 관련이없는 프로젝트에서 그것을 보았다 어딘가에 시작했다.

    이 밈이 아닌 경우를 true / false가 같은 부울 필드를 검증 할 필요가 있다는이 아이디어는 어디에서 왔는지 모르겠어요,하지만 난 궁금해 시작 해요 그래서 최근 몇 관련이없는 프로젝트에서 그것을 보았다 어딘가에 시작했다.

    그 부울 필드는 참 또는 거짓되어야한다. AR 당신을위한 부울 값의 구현 세부 사항을 담당한다. 당신은 부울 필드를 원하는 경우, 데이터베이스에 부울 필드를 만듭니다. 이야기의 끝.

    소스를 보면, 여기 부울에 값을 변환하는 코드는 다음과 같습니다

    # File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 147
    147:         def value_to_boolean(value)
    148:           if value.is_a?(String) && value.blank?
    149:             nil
    150:           else
    151:             TRUE_VALUES.include?(value)
    152:           end
    153:         end
    

    그리고 여기에 자신의 부울 대응 동일시 값입니다 :

    TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
    FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set
    

    그것이 있어야로 위의 코드에서 다른 살펴 본다 그래서 모든 것이 당신이 잘못된 기대하는지하는 것을 제외하고있다. 부울 값으로 "foo는"할당 우리는 "foo는"이 부울 필드의 기본값 그래서 나중에는 접근에서 돌아 무슨 거짓으로 허용 진정한 값 목록에 없습니다를 참조하십시오. 필드의 값은 부울 여전히 : 모델 유효 => [TRUE, FALSE] 그렇게. "거짓"과 "123"같은 이유로 실패합니다. 필드가 true로 설정되고 정지 위에서 설명한 이유로 유효 도착하므로 "참"부울 참의 허용 값이다.

  2. ==============================

    2.내가 더 레일 전문가는 아니지만 그러나 나는 여기에 내 목을 내밀어 당신이 절대적 대한 부울 값을 유효성을 검사 할 않는 것을 말할 것이다 : 포함 => {에서 => [참, 거짓을]} - 당신이 할 가정입니다 하지 (NULL) 값을 nil을 허용하려는.

    내가 더 레일 전문가는 아니지만 그러나 나는 여기에 내 목을 내밀어 당신이 절대적 대한 부울 값을 유효성을 검사 할 않는 것을 말할 것이다 : 포함 => {에서 => [참, 거짓을]} - 당신이 할 가정입니다 하지 (NULL) 값을 nil을 허용하려는.

    참, 거짓, 그리고 NULL : 데이터베이스 프로그래밍 배경에서 오는, 나는 부울 필드가 세 값을 가질 수 있음을 염두에두고 배웠다. 네이티브 SQL로 프로그래밍하는 경우, 널 (NULL) 추가 작업을 많이 일으키는 특수 처리 (대신 = NULL의 널 (null)입니다)이 필요합니다.

    3.2 오늘 레일 테스트에서, 전무 값으로 검증되지 않은 부울 필드를 만들고이 충실 NULL로 저장된 내 PostgreSQL 데이터베이스에 저장하는 아무 문제가 없었다. 나는 레일의 논리 값에 대한이 방법을 사용하여 계획입니다 발생할 수있는 모든 문제를 방지하려면 :

    내가 사용할 수 없습니다 처음에 그것은 직관적이지의 : 존재 유효성 검사를하지만, 밝혀 : 존재의 유효성을 검사 값이 비어 있지 않은 것을, 그리고 가치 거짓 비어 있습니다. 유효성을 검사하는 경우 즉, : 존재 => true와 false로 값을 설정, 유효성 검사가 실패합니다. 이 API 및 Karmajunkie의 대답 @에서 @ 폴 Jungwirth의 의견에 validates_presence_of 참조하십시오.

  3. from https://stackoverflow.com/questions/5170008/rails-validating-inclusion-of-a-boolean-fails-tests by cc-by-sa and MIT license