我正在尝试在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
答案 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然后它工作正常。