提问人:Ilea Cristian 提问时间:9/14/2012 更新时间:8/19/2013 访问量:9333
FactoryGirl 搞砸了 rake db:migrate 过程
FactoryGirl screws up rake db:migrate process
问:
我正在使用 Rspec (2.11.0) 和 FactoryGirl (4.0.0) 在 Ruby on Rails 3 中做 TDD/BDD。我有一个类别模型的工厂:
FactoryGirl.define "Category" do
factory :category do
name "Foo"
end
end
如果我删除,创建然后迁移测试环境中的数据库,我会收到以下错误:
rake aborted!
Could not find table 'categories'
出现此问题的原因是 FactoryGirl 期望表已存在 (出于某种奇怪的原因) 。如果我从我的 rails 应用程序中删除 spec 文件夹并这样做,它可以工作。另外,如果我从我的标记,因为它也可以工作(那么我必须注释该要求才能运行 rspec)。db:migrate
factory-girl-rails
Gemfile
:require => false
我在这里找到了有关此问题的一些信息: https://github.com/thoughtbot/factory_girl/issues/88
我做错了什么吗?我怎样才能“通过”任务中的FactoryGirl阶段?db:migration
答:
我认为您需要在 Gemfile 中拥有这样的工厂女孩定义:
gem 'factory_girl_rails', :require => false
然后你只需要在你的 spec_helper.rb 中这样:
require 'factory_girl_rails'
这就是我一直使用这颗宝石的方式。除了 spec_helper.rb 之外,您不需要在其他地方要求它。您目前想要的方法是错误的。
评论
信息来源: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.
解决此问题的简单方法是将工厂中的任何模型包装在块中,从而延迟对它们的评估。所以,而不是这个:
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
如果你有很多工厂,这可能不可行,但它相当简单。另请参阅此处。
评论
你不需要做任何事情。我认为问题是你对 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
评论