0

再会。我得到这个错误

1) Subscription 
     Failure/Error: @subscription = FactoryGirl.create(:subscription)
     ActiveRecord::RecordInvalid:
       Encountered errors: Email already exists, Login already exists

虽然在 FactoryGirl 我指定了这些字段的唯一性^

召唤工厂女孩

@subscription = FactoryGirl.create(:subscription)

build 无法实现,因为

应该 validate_uniqueness_of(:category_id).scoped_to(:user_id)

工厂:

factory :subscription do
    association :category, factory: :advt_category 
    user
  end
factory :user do
    sequence(:login) { |n| "user__#{n}"  } 
    password "password"
    sequence(:email) { |n| "example__#{n}@example.com"}  
end

如何解决这个错误?为什么会出现?

更新

我最终销毁了该规范中用户模型的所有记录

before do
User.destroy_all
end
4

2 回答 2

4

最有可能的问题是,当您开始规范时,您的测试数据库不干净。当 rspec 过早退出或被杀死时,可能会发生这种情况。

您的方法before { User.destroy_all }可行,但很乏味(因为您可能还需要在其他规范中添加它),而且速度很慢。

我建议您使用database_cleaner gem并像这样扩展您的 rspec 配置:

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.before :suite do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with :truncation
  end

  config.before(:each) { DatabaseCleaner.start }
  config.after(:each)  { DatabaseCleaner.clean }
end

当您将 Capybara 用于您的请求规范时,将before :each块更改为:

config.before :each do
  if Capybara.current_driver == :rack_test
    DatabaseCleaner.strategy = :transaction
  else
    DatabaseCleaner.strategy = :truncation
  end

  DatabaseCleaner.start
end
于 2012-10-24T16:29:02.490 回答
0

我认为这会奏效

为用户调用 FactoryGirl 并将其传递给订阅调用

@user = FactoryGirl.create(:user) 
@subscription = FactoryGirl.create(:subscription, :user_id => @user.id)

至于为什么会发生这种情况,我们需要查看更多规范

于 2012-10-24T08:26:08.267 回答