4

rspec で ActiveRecord を作成するとき、有効なレコードにはフィクスチャを使用します。しかし、テストでフィクスチャを使用すると、検証に失敗するようです。次の例では、従業員は完全に有効であるように見えますが、仕様内の関連する検証では無効であると示されています。

class Employee < ActiveRecord::Base
  validates_presence_of     :email
end

class User < ActiveRecord::Base
  validates_associated      :employee
end

#Command line debugger in 'debugger' (below) returns:
Employee.find(745185059).errors.count         # => 0
Employee.find(745185059).errors.full_messages # => []
Employee.find(745185059).valid?               # => true

例えば:

describe SessionsController do
  fixtures :users, :employees

  describe "Logging in by cookie" do
    def set_remember_token token, time
      @user[:remember_token]            = token; 
      @user[:remember_token_expires_at] = time
      debugger
      @user.save! # THIS SAYS THE EMPLOYEE IS INVALID, but why, if the fixtures are good?
    end    
    it 'logs in with cookie' do
      stub!(:cookies).and_return({ :auth_token => 'hello!' })
      logged_in?.should be_true
    end
  end
end

検証が失敗する理由はありますか? (もちろん、中間コードの多くを切り取っています。エラーが完全に別の場所にある可能性があります)

4

1 に答える 1

6

.save の後で @user をデバッグすることができます (強打なしで)。これにより、エラーが追加されます。モデルのコールバックが原因であるか、validate メソッドが実行する何かが原因である可能性があります。テストでは、次のようにします。

@user.save
puts @user.errors.inspect # or your command line debugger

テストの実行時に出力を読み取ります。

于 2009-06-04T16:39:44.303 に答える