RSpec失败:迁移后无法找到表格?

时间:2011-03-10 18:53:54

标签: ruby-on-rails ruby-on-rails-3 rspec factory-bot

我有一个裸露的rails 3应用程序,其中一个模型使用rails g model User生成。

我添加了一个工厂(使用factory_girl_rails):

Factory.define :user do |f|
  f.email "test@test.com"
  f.password "blah"
  f.password_confirmation "blah"
  f.display_name "neezer"
end

然后我添加了一个测试:

require 'spec_helper'

describe User do

  subject { Factory :user }

  it "can be created from a factory" do
    subject.should_not be_nil
    subject.should be_kind_of User
  end

end

然后我使用rake db:migrate 迁移我的数据库

然后我使用rspec spec运行测试,测试失败并显示以下内容:

Failures:

  1) User can be created from a factory
     Failure/Error: subject { Factory :user }
     ActiveRecord::StatementInvalid:
       Could not find table 'users'
     # ./spec/models/user_spec.rb:5:in `block (2 levels) in <top (required)>'
     # ./spec/models/user_spec.rb:8:in `block (2 levels) in <top (required)>'

我很困惑,因为我刚刚迁移了我的数据库,而我的schema.db文件反映出存在用户表,那么是什么给出了?

我知道这是一个初学者的问题,但是我的头靠在墙上是行不通的......

factory_girl (1.3.3)
factory_girl_rails (1.0.1)
rails (3.0.5)
rspec-rails (2.5.0)
sqlite3 (1.3.3)

3 个答案:

答案 0 :(得分:83)

尝试执行

rake db:test:prepare

这应该修复你的测试db。

答案 1 :(得分:2)

这里的要点是rspec命令不会在测试数据库上执行迁移。并且rake db:migrate仅在您当前的环境中运行迁移,可能是development。其他环境如productiontest结束时没有进行这些更改。

你可以运行

rake spec

这将准备您的测试数据库(使用schema.rb删除和创建)并运行所有测试。

正如the other answer建议的那样:

rake db:test:prepare

还会设置你的测试数据库,但之后你必须运行rspec命令,所以,我个人更喜欢第一个选项。

答案 2 :(得分:0)

试试这个:

For rails version > 4.1+ this solution will work as the current scenario.

but in Rails 4.1+, rake db:test:prepare is deprecated.

尝试使用

rake db:migrate RAILS_ENV=test (it will work for all version of rails)