16

我正在尝试在 Ruby on Rails 中使用 Test::Unit 和 Shoulda 设置 Factory Girl。我已经安装了 gem,在 test/factories 目录下创建了我的工厂文件,并在 test/models 目录下创建了我的规范文件。我得到的当前错误是“ArgumentError:没有这样的工厂:测试”,这让我相信 test_factory.rb 文件没有被加载?关于我应该改变什么的任何想法?

这是我的文件。

#test/factories/test_factory.rb
Factory.define :test do |t|  
  t.name 'test_spotlight'  
  t.label 'test spotlight label'  
end

#test/modes/test_spec.rb
require 'test_helper'
require 'factory_girl'
class TestTest < Test::Unit::TestCase
  def setup
    @test = Factory.build(:test)
  end

  context "A test" do
    should "save with the minimum requirements" do
      assert @test.save
    end
  end 
end 
4

13 回答 13

40

我在我的一个项目中也遇到了这个问题。我不确定是什么导致初始化代码被跳过,但你可以像这样强制加载工厂定义:

require 'factory_girl'
Factory.find_definitions

希望这可以帮助。

于 2009-08-31T20:08:35.793 回答
3

试着把它放在 test_helper.rb 中:

require 'factory_girl'
Dir.glob(File.dirname(__FILE__) + "/factories/*").each do |factory|
  require factory
end
于 2009-11-23T20:53:47.190 回答
3

刚刚发现 factory_girl_rails,它说自动加载是它唯一的额外功能https://github.com/thoughtbot/factory_girl_rails

于 2011-04-01T10:37:18.107 回答
2

我有同样的问题。最终,我将所有工厂都放在“/test/factories.rb”中,并在“/test/test_helper.rb”文件中写入以下行:

require 'factory_girl'
require File.dirname(__FILE__) + "/factories"

您可以通过在 test_helper 中要求它们对多个文件执行相同的操作。我还没有弄清楚为什么“factory_girl's”自述文件中提到的自动包含没有发生。

于 2009-11-12T17:24:54.113 回答
2

我还设法通过将这一行放入我的 environment.rb 来解决这个问题:

config.gem "factory_girl", :source => "http://gemcutter.org"

还要确保您拥有最新的 gem:

名称从“thoughtbot-factory_girl”更改为“factory_girl”,来源从“ http://gems.github.com ”更改为“ http://gemcutter.org ”。

于 2009-12-18T09:59:35.100 回答
2

如果您在 ruby​​ 1.9.2 中遇到此问题,则需要扩展路径。

File.expand_path("test/factories.rb")

这个补丁解决了我的问题。我刚刚发送了一个拉取请求。之后,您可以将其添加到您的test_helper.rb

require 'factory_girl'
FactoryGirl.find_definitions
于 2010-07-24T15:06:28.000 回答
1

如果我只在 test_helper.rb 中需要'factory_girl',我会得到你提到的相同行为,但是如果我在我的 config/test/environment.rb 中需要它(注意我使用environmentist)它会正确找到工厂定义而没有任何问题。

我在阅读了工厂女孩 rdoc 后尝试了这个,它说将 config.gem 放在你的环境中。

于 2009-11-22T22:24:02.920 回答
1

我也遇到了这个问题——在将 FactoryGirl 更新到 1.3.2 之后——来自测试/工厂的工​​厂不再自动加载。

我可以通过将 dg 中的代码添加到 test_helper.rb 中来解决这个问题:

Dir.glob(File.dirname(__FILE__) + "/factories/*.rb").each do |factory|
 require factory
end

在 Textmate 中运行单个测试时,一切正常,但是使用 rake test 从命令行运行所有单元测试:units 失败并出现 DuplicateDefinitionError(我读到它可能与 ruby​​ 1.8.x 有关)。所以我稍微改变了代码:

if (!Factory.factories || Factory.factories.empty?)
  Dir.glob(File.dirname(__FILE__) + "/factories/*.rb").each do |factory|
    require factory
  end
end
于 2010-10-19T13:24:47.943 回答
0

你试过移动

require 'factory_girl'

到你的test/test_helper.rb

工厂自动加载机制可能取决于调用 require 的位置。它可能试图找到工厂 *test/models/factories/** 而不是 *test/factories/**

于 2009-07-21T21:01:42.157 回答
0

不要将您的工厂文件命名为 test_factory.rb,而是尝试将其命名为 factory.rb

于 2009-07-22T03:03:41.943 回答
0

有趣的。我在尝试让黄瓜与 factory_girl 一起工作时遇到了类似的问题。我最初将 factory_girl 配置为要查找('config.gem'),但未在 cucumber 环境中加载,并且在 'features/support/env.rb' 中完全需要,就像 cucumber 为 webrat 所做的一样,等等。这才开始当我明确告诉 factory_girl 按照上面 Kenny 的建议找到它的定义时工作。

当我从 env.rb 中删除 require 语句并在 cucumber 环境中完全需要 factory_girl 时,效果消失了, factory_girl 开箱即用。

所以这似乎是一个何时(或在何种情况下)加载 factory_girl 的问题。

于 2010-03-09T12:09:55.403 回答
0

由于不同的人使用不同版本的 Rails(2.x 和 3.x 是现在最常见的),因此包含环境的其他相关部分很重要(最重要的是您使用的是哪个版本的 Rails) . 来自factory_girl 网页,版本 1.3.0 文档(http://rubydoc.info/gems/factory_girl/1.3.0/frames):

如果您想在 Rails 3 中使用 factory_girl,请使用 factory_girl_rails gem,而不是这个。

如果您想在 Rails 3 之前的 Rails 版本中使用 factory_girl,请使用 1.2.4 版本。

如果您在加载时遇到问题,我建议您确保使用正确的版本。我假设大于 1.2.4 的 factory_girl 版本作为“factory_girl_rails”(Rails 3.0+)gem 的依赖项引入。

于 2011-08-24T21:52:02.213 回答
0

我添加 到有帮助的 spec_helper.rb 中,但后来我记得 Spork 有时会有点问题,所以我在没有的情况下重新启动了 Spork ,然后它工作正常。require 'factory_girl' require File.dirname(FILE) + "/factories" require

于 2011-09-19T14:50:48.367 回答