设置工厂女孩与测试::单位和应该

时间:2009-07-21 15:38:18

标签: ruby-on-rails ruby shoulda factory-bot testunit

我正在尝试在Ruby on Rails中使用Test :: Unit和Shoulda设置Factory Girl。我已经安装了gem,在test / factories目录下创建了我的工厂文件,并在test / models目录下创建了我的spec文件。我得到的当前错误是'ArgumentError:No such factory:test',这让我相信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 

13 个答案:

答案 0 :(得分:40)

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

require 'factory_girl'
Factory.find_definitions

希望这有帮助。

答案 1 :(得分:3)

尝试将其放入test_helper.rb:

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

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

你可以通过在test_helper中要求它们来为多个文件做同样的事情。我还没弄清楚为什么“factory_girl”自述文件中提到的auto-include不会发生。

答案 4 :(得分:2)

我还设法通过将此行放入我的environment.rb:

来摆脱这个问题

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

确保您拥有最新的宝石:

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

答案 5 :(得分:2)

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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

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

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

在Textmate中运行单个测试时,一切正常,但正在运行,例如使用rake测试从命令行进行的所有单元测试:单元失败并出现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

答案 8 :(得分:0)

您是否尝试过移动

require 'factory_girl'

test / test_helper.rb

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

答案 9 :(得分:0)

请尝试将其命名为factory.rb

,而不是命名工厂文件test_factory.rb

答案 10 :(得分:0)

有趣。我有一个类似的问题试图让黄瓜与factory_girl一起工作。我最初配置了factory_girl来寻找('config.gem'),但没有在黄瓜环境中加载,并且在'features / support / env.rb'中完全需要,就像黄瓜对webrat一样,等等。当我明确告诉factory_girl找到Kenny上面提到的定义时,我正在工作。

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

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

答案 11 :(得分: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。

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

答案 12 :(得分:0)

我补充说 require 'factory_girl' require File.dirname(FILE) + "/factories" 对spec_helper.rb有所帮助,但后来我记得Spork有时会遇到一些问题,所以我在没有require的情况下重启了Spork然后它工作正常。