2

テストにはShouldaRspecを使用しています。

テスト仕様でこれを試してみると、モデルで検証を行っていない場合でも合格し続けます。

it { should ensure_inclusion_of(:private).in_array(%w[true false]) }

属性は、trueまたはfalseのいずれかのブール値です。

validates_inclusion_of :private, :in => [true, false]

これを正しく書くにはどうすればよいですか?

4

1 に答える 1

4

True文字列でFalseはないため、%wは使用しないでください。

it { should ensure_inclusion_of(:private).in_array([true, false]) }

更新-2014年4月10日

この検証は、Shouldaの現在のバージョンでは機能せず、この最近のコミットに従って、修正されませんが、代わりに例外が発生します。

true, 1, '1', 't', 'T', 'true', 'TRUE'ブールフィールドに割り当てられた値はすべてtrue(によって設定)またはfalse(他のものによって設定)のいずれかにキャストされるため、ブールフィールドをテストするための私の好ましいアプローチは次のとおりです。

  • データベースでnullを許可するブール値の場合-テストは不要であり、可能な値はすべて有効です。

  • データベースでnullを許可しないブール値の場合-モデルにが設定されているit { should_not allow_value(nil).for(:field)場合に渡されるブール値を使用しますvalidates :field, inclusion: { in: [true,false] }

于 2012-09-11T07:16:44.357 に答える