FactoryGirl搞砸了rake db:migrate进程

时间:2012-09-14 11:06:55

标签: ruby-on-rails rspec rake bdd factory-bot

我在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阶段?

4 个答案:

答案 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.rbrake 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