私の検証には、pluck(:id) ステートメントが含まれています。検証はコンソールでは機能しますが、test_helper では失敗します。その関数を関数が返す配列に置き換えると、すべてのテストがコンソールと test_helper でパスします。
詳細は次のとおりです。
Kubuntu 12.04 で Rails 3.2.13 を実行しています。
バージン プロジェクトで 2 つのモデルをセットアップします。
user - rails g モデル ユーザー role_id:integer
role - rails g モデルの役割 role_name:string
アプリ/モデル/user.rb
class User < ActiveRecord::Base
attr_accessible :role_id
#validates :role_id, inclusion: { in: [1, 2, 3] } # validation using the result array.
validates :role_id, inclusion: { in: Role.pluck(:id) } # validation using the pluck(:id) function.
end
app/models/role.rb は生成されたままです。
コンソールを使用して 3 つのロールを追加しました。ID は [1, 2, 3] です。
コンソールで検証を確認しました。
u = User.new(role_id: 1)
u.valid?
=> true
u.role_id = 5 # value out-of-range
u.valid?
=> false
u.role_id = 2 # value in range
u.valid?
=> true
したがって、この検証は意図したとおりに機能するようです。
u.save
も働いた。
次に、テストを追加しました:
テスト/ユニット/user_test.rb
require 'test-helper'
class UserTest < ActiveSupport::TestCase
test "role_id must be valid" do
@u = User.new(role_id: 1)
assert(@u.valid?,"Invalid role")
end
end
でテストを実行
rake test
テストは失敗しましたが、コンソールの結果で確認されたように role_id は正しいです。
app/models/user.rb の検証を上記のコメントに置き換えた場合
validates :role_id, inclusion: { in: [1, 2, 3] }
他の検証、テスト パス、およびコンソール パスをコメント アウトします。rspec と同じ効果。これを数回繰り返しましたが、常に同じ効果です。このサイトで多くの興味深いものを見つけ、proc、ラムダ、ブロック、カスタム検証をいじりましたが、成功しませんでした。
たくさんのことを学んだと思いますが、今からイライラし始めます。誰かが私の間違いに私を導くことができますか?
どうもありがとう。