2011-09-10 71 views
3

以下是运行RSpec的规格的错误消息:Factory_girl和Factory_girl_rails冲突错误

/factory_girl-2.1.0/lib/factory_girl/registry.rb:38:in`add_as':已经定义:用户(FactoryGirl :: DuplicateDefinitionError)

安装了factory_girl(2.1.0)和factory_girl_rails(1.2.0)。如果factory_girl 2.1.0被移除(导致未定义方法的另一个错误),则此错误消息将消失。然而,在rspec的另一台笔记本电脑上运行相同的设置没有问题。

这里是bundle show命令输出的一部分。

  • 黄瓜(1.0.2)
    • 黄瓜导轨(1.0.2)
    • database_cleaner(0.6.7)
    • DIFF-LCS(1.1.2)
    • erubis(2.7 0.0)
    • execjs(1.2.4)
    • factory_girl(2.1.0)
    • factory_girl_rails(1.2.0)
    • FFI(1.0.9)
    • 小黄瓜(2.4.5)
    • 上调(1.2.1)
    • I18N(0.6.0)
    • jQuery的导轨(1.0.13)
    • JSON (1.5.3)
    • json_pure(1.5.3)
    • 邮件(2.3.0)
    • MIME类型(1.16)
    • multi_json(1.0.3)
    • 引入nokogiri(1.5.0)
    • 通晓(0.3.2)
    • 机架(1.3.2)
    • 机架缓存(1.0.3)
    • 机架式(0.8.3)
    • 机架SSL(1.3.2)
    • 架测试(0.6.1)
    • 导轨(3.1.0)
    • railties(3.1.0)
    • 耙(0.9.2)
    • 的RDoc(3.9.4)
    • rspec的(2.6.0)
    • rspec的核(2.6.4)
    • rspec的-预期(2.6.0)
    • rspec的-嘲笑(2.6.0)
    • rspec的护栏(2.6.1)
    • ruby​​zip(0.9.4)
    • SASS(3.1.7)
    • SASS-导轨(3.1.0.rc.6)
    • 硒的webdriver(2.4.0)
    • simple_form(1.4.2)

这里是Gemfile中用于factory_girl和RSpec的一部分。

group :test do 
    # Pretty printed test output 
    gem "rspec-rails", ">= 2.0.0" 
    gem "cucumber-rails", ">=0.3.2" 
    gem 'webrat', ">= 0.7.2" 
    gem 'factory_girl_rails' 
    gem 'turn', :require => false 
end 

有什么想法?谢谢。

+0

您需要显示您的registry.rb工厂文件,这是您的错误发生的地方。 – 99miles

+0

user938363,你已经解决了这个问题吗? –

回答

6
gem 'factory_girl_rails', :require => false 

是固定的,对我来说:)

+0

也注释掉:''需要'spec_helper.rb'中的factory_girl_rails'' – Eric

1

我有一个非常相同的问题。这意味着你无意中加载了两次工厂。您可以将一些文本输出到工厂文件顶部的日志中,以查看是否正在加载两次。

我的问题是Spork:它使用一些魔法来禁用factory_girl_rails工厂重新加载,并且您必须在spec_helper中以更可控的方式加载工厂,但由于某些原因,它无法在最新版本的gem上工作。我刚刚删除了Spork,现在它工作正常。

1

rake db:test:prepare 我修正了同样的错误(不知道为什么),希望能帮助某人。 我在想这是spork + factory_girl_rails问题,但事实证明它不是。我现在使用spork + fgr没有麻烦。

1

我解决了问题,最终摆脱了factory_girl_rails gem。仍然不知道这是怎么发生的。没有运动安装在我的系统上。

感谢您的分享。

1

有同样的问题。事实证明,我有一个与我的工厂命名相同的规范,并且导致了错误。

我既有规格/型号/ user_spec.rb规格/工厂/ user_spec.rb

我改名规格/工厂/ user_spec.rb规格/工厂/ user_factory.rb它运行良好。

3

在Factory_Girls以前的版本,你都必须做

需要在您的规格/测试“工厂”

。 有了最新的Factory Girls,您不必在规格中给出明确的要求。 因此,如果您在文件中使用require'工厂',请删除它并尝试,DuplicateDefinitionError将消失。

1

像阿伦说的,错误可能是 需要“工厂” 同样,一个工厂需要另一个工厂可能会触发该错误。例如,如果有一个名为Actors的单表继承基础和一个子分类的评论者,则Actor工厂文件可能需要一个嵌套文件用于评论者: #在文件tests/factories/actors.rb中 require'factories/actors/commenter .rb'

这需要导致重复的定义,因为(显然)该文件已被自动加载。 current docs虽然没有说清楚。

1

在我来说,我是双重定义:无论是在规格/ factories.rb,并在factory_girl_rails一个新的文件用户厂(1.4.0 )创建时我手摇型号:

规格/工厂/ users.rb的

删除的文件,并没有更多的问题。

1

此外,如果你的工厂文件的名称是这样的:factories/factory_user_spec.rb rspec会认为它是一个规格并运行它,然后工厂的女孩会要求它,将双重定义它。

1

检查你不必多工厂同名,这是原因之一导致错误

试图定义多个工厂使用相同的名称将引发一个错误。