为什么我的工厂测试会引发另一个工厂的错误?

Why my factory test raises an error from another factory?

我对 Rspec 和 factory_bot 很陌生。我有以下工厂:

FactoryBot.define do
  factory :user do
    email { "test@gmail.com" }
    password { "azerty" }
    username { "test" }
    city { "Paris"}
  end

  factory :game do
    title { "Mega Man X" }
    nostalgia_point { 9 }
    platform { "Super Nintendo" }
    developer { "Capcom" }
    release_date { Date.new(1994,1,1) }
    game_mode { "Single player" }
    genre { ["Adventure", "Platform", "Shooter"] }
    association :owner, factory: :user
  end

  factory :favorite do
    user
    game
  end
end

当我运行这个测试:

require 'rails_helper'

RSpec.describe Game, type: :model do
  let!(:favorite) { create(:favorite) }

  describe '::create' do
    context 'persistence' do
      it 'persists the favorite' do
        expect(Favorite.count).to eq(1)
      end
    end
  end
end

我收到以下错误:ActiveRecord::RecordInvalid: Validation failed: Email has already been taken, Username has already been taken

我想这是因为我的 user 工厂(设计模型)没有从我的其他测试中清除,但我绝对不确定......而且我不知道我是否应该使用不同于我做了什么来清理我所有的数据库。这是我在 factory_bot.rb:

中写的
RSpec.configure do |config|
  config.include Warden::Test::Helpers

  config.after :each do
    Warden.test_reset!
  end

  config.include FactoryBot::Syntax::Methods
end

如果有更好的做法或者只是告诉我我缺少什么,我将不胜感激。谢谢!

您的用户模型中必须有一个验证,以防止您使用数据库中已有的电子邮件 and/or 用户名创建用户。当你有一个工厂(favorite)时,它会尝试创建一个用户和一个游戏,而不首先检查用户电子邮件 and/or 用户名是否已经存在,它会失败,因为它使用你设置的值它们总是相同的(“test@gmail.com”,“test”,相应地)。

您可以为此使用 FactoryBot sequence

sequence :email do |n|
  "test#{n}@gmail.com"
end
sequence :username do |n|
  "test-#{n}"
end

这会阻止您对新记录使用相同的值,因为 sequence 会产生一个增量整数,因此只要测试套件运行,该值就不会相同。