1

私の検証には、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、ラムダ、ブロック、カスタム検証をいじりましたが、成功しませんでした。

たくさんのことを学んだと思いますが、今からイライラし始めます。誰かが私の間違いに私を導くことができますか?

どうもありがとう。

4

1 に答える 1

0

テストは別の環境と DB で実行されます (テスト環境/DB は偶然ではありません)。

ロールなどのテスト データが必要です。

Factory Girl、DBシードなど、複数のオプションがあります。

テスト環境で開始することにより、コンソールで同じ失敗を作成できます。

RAILS_ENV=test rails c
于 2013-06-21T19:48:22.727 に答える