一日中悩んだので、対策を記載しておきます。
例えば、以下リレーション
app/model/user.rb
class user
has_many :articles
end
app/model/user.rb
class article
belong_to :user
end
以下Factoryがある場合
spec/factories/user.rb
FactoryGirl.define do
factory :user, :class => 'User' do
name '田中'
end
end
spec/factories/article.rb
FactoryGirl.define do
factory :article, :class => 'Article' do
association :user, :factory => :user
end
end
articleのテストデータを作成する時に、test_user
のデータを作成して、articleのassociationである:user
にtest_userを指定する。
spec/model/article_spec.rb
describe 'test' do
let(:test_user){
FactoryGirl.create(
:user,
:name => '松本'
) }
let(:article) {
FactoryGirl.create(
:article,
:user => test_user
)
}
# テスト内容省略
end
ファイル単体ではテスト成功。
rspec spec/model/article_spec.rb
しかし、rake spec
で全テスト実行したら、 ActiveRecord::AssociationTypeMismatch
のエラーが発生した。
ActiveRecord::AssociationTypeMismatch:
User(#70278536617000) expected, got User(#70278553470100)
根本原因はわからないが、FactoryGirl.create
をする時にオブジェクトではなくidを指定すれば、エラーはなくなった。
spec/model/article_spec.rb
let(:user){ FactoryGirl.create(:user) }
let(:article) {
FactoryGirl.create(
:article,
# :user => user
:user_id => user.id
)
}
FactoryGirlはオブジェクトで渡せるはずではなかったのか。。
全体のテストに影響がでるため、一旦この方法で解決しました。