问题描述: - 我设置了factory_girl_rails但是每当我尝试加载工厂时,它都会尝试多次加载它。
Environment:
- rails (3.2.1)
- factory_girl (2.5.2)
- factory_girl_rails (1.6.0)
- ruby-1.9.3-p0 [ x86_64 ]
> rake spec --trace
** Execute environment
-- Creating User Factory
-- Creating User Factory
rake aborted!
Factory already registered: user
我改变的唯一另一件事是: /config/initializers/generator.rb
Rails.application.config.generators do |g|
g.test_framework = :rspec
g.fixture_replacement :factory_girl
end
的Gemfile
gem 'rails', '3.2.1'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'uglifier', '>= 1.0.3'
end
gem 'jquery-rails'
gem 'devise'
gem 'haml-rails'
group :development do
gem 'hpricot'
gem 'ruby_parser'
gem "rspec-rails"
end
group :test do
gem "rspec"
gem 'factory_girl_rails'
end
gem 'refinerycms-core', :git => 'git://github.com/resolve/refinerycms.git'
gem 'refinerycms-dashboard', :git => 'git://github.com/resolve/refinerycms.git'
gem 'refinerycms-images', :git => 'git://github.com/resolve/refinerycms.git'
gem 'refinerycms-pages', :git => 'git://github.com/resolve/refinerycms.git'
gem 'refinerycms-resources', :git => 'git://github.com/resolve/refinerycms.git'
gem 'refinerycms-settings', :git => 'git://github.com/resolve/refinerycms.git'
group :development, :test do
gem 'refinerycms-testing', :git => 'git://github.com/resolve/refinerycms.git'
end
gem 'refinerycms-inventories', :path => 'vendor/engines'
FactoryGirl.define do
factory :role do
title "MyString"
end
end
这似乎是一个兼容性/环境问题,我似乎无法弄清楚。有什么建议吗?
编辑:这是我的spec / spec_helper.rb:
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
#require 'factory_girl_rails'
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
### Mock Framework
#
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
#
# config.mock_with :mocha
# config.mock_with :flexmock
# config.mock_with :rr
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
#config.fixture_path = "#{::Rails.root}/spec/fixtures"
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = true
# If true, the base class of anonymous controllers will be inferred
# automatically. This will be the default behavior in future versions of
# rspec-rails.
config.infer_base_class_for_anonymous_controllers = false
end
答案 0 :(得分:36)
在factory_girl_rails
而不是gemfile中应该需要gem spec_helper.rb
- 你可能需要两次FactoryGirl,这就是你获得副本的原因。
在你的gem文件中试试这个:
group :test do
gem "rspec"
gem 'factory_girl_rails', :require => false
end
然后确保spec_helper中的工厂女孩需要:
require 'factory_girl_rails'
顺便说一下 - 你的gemfile中不需要rspec
和rpsec-rails
。您可以使用以下内容替换它们:
group :development, :test do
gem 'rspec-rails'
end
您需要在两个组中使用rspec,以便rake任务在开发中起作用,核心测试将在测试中起作用。
答案 1 :(得分:22)
我最近遇到了同样的问题。在我的情况下,/ factories中的一个文件有一个_spec.rb结尾(使用创意cp的结果)。它装载了两次,首先是rspec,然后是工厂。
答案 2 :(得分:16)
我也有这个问题。在我的例子中,有两个具有相同代码的文件,如下所示:
FactoryGirl.define do
factory :user do
end
end
一个文件名为“Useres.rb”,另一个文件名为“User.rb”,因此我只删除了“Useres.rb”并修复了错误。
答案 3 :(得分:15)
您是否有可能将此整个代码段从配置文档中粘贴到支持文件中?
# RSpec
# spec/support/factory_girl.rb
RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
end
# RSpec without Rails
RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
config.before(:suite) do
FactoryGirl.find_definitions
end
end
如果你阅读了评论,你会发现你只想要一个或另一个。我犯了这个错误并得到了问题中陈述的错误。
答案 4 :(得分:9)
另一个可能的原因是FactoryGirl.find_definitions
的多余电话。
如果找到,请尝试删除find_definition。
答案 5 :(得分:9)
两次致电FactoryGirl.define(:user)
或FactoryGirl.find_definitions
,您也遇到此问题。
尝试删除第二个电话或:
FactoryGirl.factories.clear
FactoryGirl.find_definitions
答案 6 :(得分:5)
确保您的各个工厂文件不以_spec
结尾。
答案 7 :(得分:2)
https://github.com/thoughtbot/factory_girl/issues/638
将工厂女孩加载到开发控制台中也会这样做:
require 'factory_girl_rails'; reload!; FactoryGirl.factories.clear; FactoryGirl.find_definitions
将在Factory Girl v4.4.0下的序列上引发FactoryGirl::DuplicateDefinitionError
。
似乎在FG中处理序列的方式不同,只需将所有序列包装在一个救援块中就可以解决问题。
例如:
begin
sequence :a_sequence do |n|
n
end
sequence :another_sequence do |n|
n*2
end
rescue FactoryGirl::DuplicateDefinitionError => e
warn "#{e.message}"
end
答案 8 :(得分:1)
我有同样的问题。我所做的是将spec / factories.rb移动到spec / factories / role.rb
答案 9 :(得分:1)
我有完全相同的问题。 当您使用脚手架生成器时会发生这种情况。 它会自动在test / factories /中创建一个工厂 因此,通常只需删除此文件即可解决您的问题
答案 10 :(得分:1)
我遇到了同样的问题,结果发现在users.rb
内部创建了一个由test/factories
命令创建的默认rails g
。此文件导致冲突。删除文件后,错误消失了。
答案 11 :(得分:1)
尝试运行
rake db:test:prepare
答案 12 :(得分:1)
请尝试执行以下步骤
1)我在RAILS_ROOT中查找了所有出现的“factory_girl”:
找到。 -name“* .rb”| xargs grep“factory_girl”2)因为这是我通过“rails plugin new --mountable”创建的完整引擎插件“app”,所以我在RAILS_ROOT // lib /下面有一个名为“engine.rb”的文件。它有:
config.generators do |g|
g.test_framework :rspec, :fixture => false
g.fixture_replacement :factory_girl, :dir => 'spec/factories'
g.assets false
g.helper false
end
3)我的spec_helper.rb文件中也有以下内容:
Dir [“#{File.dirname( FILE )} / factories / * / .rb”]。每个{| f |要求f}
4)engine.rb中的g.fixture_replacement行和spec_helper.rb中的Dir行正在初始化工厂两次。我在spec_helper.rb中注释掉了那个,并且修复了问题。
或者,您可以留在spec_helper.rb并在engine.rb中注释掉。
两者都解决了我的问题。
答案 13 :(得分:1)
我有同样的问题。这是因为你使用gem'refinerycms-testing'?这需要工厂女孩,所以你应该提交这个宝石,或者提交宝石'factory_girl_rails',不要使用所有这些宝石。
#gem 'refinerycms-testing', '~> 2.0.9', :group => :test
gem 'factory_girl_rails', :group => :test
或
#gem 'factory_girl_rails', :group => :test
gem 'refinerycms-testing', '~> 2.0.9', :group => :test
答案 14 :(得分:1)
我遇到了同样的问题 - 请确保您没有在spec / support / env.rb文件中第二次加载FactoryGirl。
答案 15 :(得分:1)
我将spec / factory重命名为spec / setup_data,问题就消失了。 尝试将规范/工厂重命名为适合您的任何东西,应该可行。
答案 16 :(得分:0)
最奇怪的是,我在代码中出现以下语法错误时出现此错误:
before_validation :generate_reference, :on: :create
:on:
导致此错误。如何或为何仍然是一个谜。
答案 17 :(得分:0)
我通过从命令行删除spec/factories/xxx.rb
来解决它:
rspec spec/factories/xxx.rb spec/model/xxx.rb # before
rspec spec/model/xxx.rb # after
答案 18 :(得分:0)
对我来说,这个问题来了,因为同时使用了两个宝石
onClick(event:any) {
event.stopPropagation();
console.log(event);
const newEvent = Object.assign({}, event, { type: 'dxcontextmenu' });
console.log(newEvent);
event.target.dispatchEvent(newEvent);
// event.target.dispatchEvent(new Event('dxcontextmenu', { bubbles: true }));
}
要解决,我从gem文件中删除了gem 'factory_bot_rails'
gem 'factory_girl_rails'
。
并将gem 'factory_bot_rails'
添加到require 'factory_girl'
文件中。
spec/factories/track.rb
我希望这会有所帮助。
答案 19 :(得分:0)
我解决了这个问题,因为我试图创建两个工厂。我的功能规格包括以下行:
let!(:user) { create(:user) }
然后我使用了sign_up(用户)辅助方法:
def sign_up(user)
visit '/users/sign_up'
fill_in 'Email', with: user.email
fill_in 'Password', with: user.password
fill_in 'Password confirmation', with: user.password_confirmation
click_button 'Sign up'
end
回到我的功能规范,我打电话给:
context 'logging out' do
before do
sign_up(user)
end
...
因此有效地尝试注册已经由工厂创建的用户。
我将sign_up(user)
更改为sign_in(user)
,将帮助程序更改为:
def sign_in(user)
visit '/users/sign_in'
fill_in 'Email', with: user.email
fill_in 'Password', with: user.password
click_button 'Log in'
end
现在user
参数由于let!
块而导致数据库中的用户创建,sign_up(user)
将其记录下来。
希望这有助于某人!
哦!我也不得不发表评论:
Dir[Rails.root.join('spec/factories/**/*.rb')].each { |f| require f }
正如很多其他答案所暗示的那样。
答案 20 :(得分:0)
就我而言,
首先,我的同事使用factory_girl
gem with
Dir[Rails.root.join('spec/factories/**/*.rb')].each { |f| require f }
rails_helper
中的。
几天后,我用factory_girl_rails
取代了宝石。由于这种新宝石也在内部进行,所以工厂注册了两次。这导致了错误。
从rails_helper
删除该行并且它有效。
答案 21 :(得分:0)
检查是否通过模型生成器添加了工厂。我的生成器制作了一个模型,我在我的主factory.rb文件中添加了一个。删除自动生成的那些对我有用。
答案 22 :(得分:0)
使用rspec-rails和factory_girl_rails
替换refinerycms-testing gem答案 23 :(得分:0)
我在factories.rb中定义了同名工厂,我发现其他人在工厂目录下定义了同一个工厂。所以实际上我可以在不定义另一个的情况下使用它。
答案 24 :(得分:0)
我也遇到了同样的问题并在spec_helper.rb文件中注释了一行解决了我的问题。
尝试从spec_helper.rb文件中注释掉这一行,你应该很好。
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
答案 25 :(得分:0)
我刚刚发现我在不小心打电话给cucumber features
时得到了这个答案。当我刚刚拨打cucumber
时,问题就消失了。
答案 26 :(得分:-1)
检查您是否有多个具有相同名称的工厂,这是导致错误的原因之一
尝试定义具有相同名称的多个工厂会引发错误。