Factory_girl和Factory_girl_rails冲突错误

时间:2011-09-10 21:29:20

标签: ruby-on-rails-3 rspec2 factory-bot

以下是运行rspec规范的错误消息:

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

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

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

  • 黄瓜(1.0.2)
    • cucumber-rails(1.0.2)
    • database_cleaner(0.6.7)
    • diff-lcs(1.1.2)
    • erubis(2.7.0)
    • execjs(1.2.4)
    • factory_girl(2.1.0)
    • factory_girl_rails(1.2.0)
    • ffi(1.0.9)
    • 小黄瓜(2.4.5)
    • hike(1.2.1)
    • i18n(0.6.0)
    • jquery-rails(1.0.13)
    • json(1.5.3)
    • json_pure(1.5.3)
    • mail(2.3.0)
    • mime-types(1.16)
    • multi_json(1.0.3)
    • nokogiri(1.5.0)
    • polyglot(0.3.2)
    • rack(1.3.2)
    • rack-cache(1.0.3)
    • 机架式(0.8.3)
    • rack-ssl(1.3.2)
    • rack-test(0.6.1)
    • rails(3.1.0)
    • railties(3.1.0)
    • rake(0.9.2)
    • rdoc(3.9.4)
    • rspec(2.6.0)
    • rspec-core(2.6.4)
    • rspec-expectations(2.6.0)
    • rspec-mocks(2.6.0)
    • rspec-rails(2.6.1)
    • ruby​​zip(0.9.4)
    • sass(3.1.7)
    • sass-rails(3.1.0.rc.6)
    • selenium-webdriver(2.4.0)
    • simple_form(1.4.2)

这是factory_girl和rspec的gemfile的一部分。

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

有什么想法?感谢。

10 个答案:

答案 0 :(得分:6)

gem 'factory_girl_rails', :require => false

为我修好了:))

答案 1 :(得分:3)

在以前版本的Factory_Girls中,您需要执行

要求'工厂'

在您的规格/测试中。 使用最新的Factory Girls,您无需在规格中明确要求。 因此,如果您在文件中使用require'stage',请将其删除并尝试,DuplicateDefinitionError将会消失。

答案 2 :(得分:1)

我遇到了同样的问题。这意味着你无意中加载了两次工厂。您可以从工厂文件的顶部向日志输出一些文本,以查看它是否被加载两次。

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

答案 3 :(得分:1)

rake db:test:prepare 这对我来说修复了同样的错误(不知道为什么),希望能帮到别人。 我当时认为这是spork + factory_girl_rails问题,但事实证明并非如此。我现在正在使用spork + fgr而没有麻烦。

答案 4 :(得分:1)

我最终摆脱了factory_girl_rails宝石解决了这个问题。还是不知道这是怎么回事。我的系统上没有安装运动。

感谢分享。

答案 5 :(得分:1)

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

我有 spec / models / user_spec.rb spec / factories / user_spec.rb

我将 spec / factories / user_spec.rb 重命名为 spec / factories / user_factory.rb ,并且运行正常。

答案 6 :(得分:1)

像阿伦说的那样,错误可能是一个错误     要求'工厂' 同样,在一个工厂中要求另一个工厂可以触发错误。例如,如果存在名为Actors的单表继承库和子类Commenter,则Actor工厂文件可能需要Commenter的嵌套文件:     #在文件测试/工厂/ actors.rb中     要求'工厂/演员/ commenter.rb'

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

答案 7 :(得分:1)

在我的情况下,我在 spec / factories.rb 中以及在我生成模型时创建的factory_girl_rails(1.4.0)新文件中双重定义:用户工厂:< / p>

<强>规格/工厂/ users.rb的

删除了该文件,没有更多问题。

答案 8 :(得分:1)

此外,如果您将工厂文件命名为:factories/factory_user_spec.rb rspec会认为它是一个规范并运行它,那么工厂女孩将需要它,将双重定义它。

答案 9 :(得分:1)

检查您是否有多个具有相同名称的工厂,这是导致错误的原因之一

尝试定义具有相同名称的多个工厂会引发错误。