我在Ruby on Rails 3中使用Rspec(2.11.0)和FactoryGirl(4.0.0)进行TDD / BDD。我有一个类别型号的工厂:
FactoryGirl.define "Category" do
factory :category do
name "Foo"
end
end
如果我放弃,请创建然后在测试环境中迁移数据库我收到此错误:
rake aborted!
Could not find table 'categories'
出现此问题是因为FactoryGirl期望表已经存在(出于某些奇怪的原因)。如果我从我的rails应用程序中删除spec文件夹并执行db:migrate
,它就可以了。此外,如果我将factory-girl-rails
中的Gemfile
标记为:require => false
它也有效(那么我必须发表评论,以便运行rspec)。
我在此处找到了有关此问题的一些信息:https://github.com/thoughtbot/factory_girl/issues/88
我有什么不对劲吗?如何在db:migration
任务中“通过”FactoryGirl阶段?
答案 0 :(得分:73)
我认为你需要在Gemfile中有工厂女孩的定义:
gem 'factory_girl_rails', :require => false
然后你只需要在你的spec_helper.rb中要求它:
require 'factory_girl_rails'
这就是我总是使用这个宝石的方式。您不需要在spec_helper.rb之外的其他地方要求它。你当前想要的方法是错的。
答案 1 :(得分:12)
对此问题的一个简单修复是通过将它们包装在块中来延迟对工厂中任何模型的评估。所以,而不是:
factory :cake do
name "Delicious Cake"
frosting Frosting.new(:flavor => 'chocolate')
filling Filling.new(:flavor => 'red velvet')
end
这样做(注意大括号):
factory :cake do
name "Delicious Cake in a box"
frosting { Frosting.new(:flavor => 'chocolate') }
filling { Filling.new(:flavor => 'red velvet') }
end
如果你有很多工厂,这可能是不可行的,但它相当简单。另见here。
答案 2 :(得分:3)
来自:http://guides.rubyonrails.org/testing.html
的信息当你最终破坏你的测试数据库时(它会发生,相信我),
您可以根据开发中定义的规范从头开始重建它
数据库。您可以通过运行rake db:test:prepare
。
上面的rake db:migrate
在开发环境中运行任何挂起的迁移
并更新db/schema.rb
。 rake db:test:load
从中重新创建测试数据库
当前db/schema.rb
。在后续尝试中,首先运行db:test:prepare
是个好主意,因为它首先检查待处理的迁移并适当地发出警告。
rake db:test:clone Recreate the test database from the current environment’s database schema
rake db:test:clone_structure Recreate the test database from the development structure
rake db:test:load Recreate the test database from the current schema.rb
rake db:test:prepare Check for pending migrations and load the test schema
rake db:test:purge Empty the test database.
答案 3 :(得分:1)
你不应该这样做..我认为问题是你对FactoryGirl.define的论证..
试试这个。
FactoryGirl.define do
factory :category do
name "Foo"
end
end
这应该可以正常工作,并且不会搞砸我的迁移或加载..今天,我必须解决一个问题,我直接从工厂引用模型常量,并且必须将它放在一个块中来修复问题。
FactoryGirl.define do
factory :category do
# this causes unknown table isseus
# state Category::Active
# this does not.
state { Category::Active }
end
end