FactoryGirl搞砸了rake db:migrate进程

Ile*_*ian 30 bdd rake rspec ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

如果我删除,创建然后在测试环境中迁移数据库我收到此错误:

rake aborted!
Could not find table 'categories'
Run Code Online (Sandbox Code Playgroud)

出现此问题的原因是FactoryGirl期望表已经存在(出于某些奇怪的原因).如果我从我的rails应用程序中删除spec文件夹并且这样做db:migrate,它可以工作.此外,如果我factory-girl-rails从我的标记,Gemfile因为:require => false它也有效(然后我必须发表评论,以便运行rspec).

我在这里找到了一些关于这个问题的信息:https://github.com/thoughtbot/factory_girl/issues/88

我有什么不对劲吗?如何在db:migration任务中"通过"FactoryGirl阶段?

Vad*_*mel 73

我认为你需要像Gemfile中那样有工厂女孩的定义:

  gem 'factory_girl_rails', :require => false
Run Code Online (Sandbox Code Playgroud)

然后你只需在你的spec_helper.rb中需要它:

  require 'factory_girl_rails'
Run Code Online (Sandbox Code Playgroud)

这是我总是使用这个宝石的方式.您不需要在spec_helper.rb之外的其他地方要求它.你当前想要的方法是错的.


pol*_*m23 12

解决此问题的一个简单方法是通过将它们包装在块中来延迟对工厂中任何模型的评估.所以,而不是这个:

factory :cake do
  name "Delicious Cake"
  frosting Frosting.new(:flavor => 'chocolate')
  filling Filling.new(:flavor => 'red velvet')
end
Run Code Online (Sandbox Code Playgroud)

这样做(注意花括号):

factory :cake do
  name "Delicious Cake in a box"
  frosting { Frosting.new(:flavor => 'chocolate') }
  filling { Filling.new(:flavor => 'red velvet') }
end
Run Code Online (Sandbox Code Playgroud)

如果你有很多工厂,这可能是不可行的,但它是相当简单的.另见这里.