RSpec失败:迁移后找不到表...?

30

我有一个裸的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个回答

87

尝试执行

rake db:test:prepare

这应该可以修复你的测试数据库。


我需要在每次创建新的迁移时运行它吗,还是它只是“引导”测试数据库? - neezer
1
只需要运行一次,就像 db:migrate 一样,我通常会将它放在一个自定义任务中,该任务可以迁移、加载固定数据、测试数据库等等。 - Spyros
1
如果rake db:test:prepare不能解决问题,有什么想法吗?:( - Raphael
请检查您的迁移脚本,以防它没有正确定义。这意味着您的表确实没有被正确创建。 - activars
我什么时候才能不再被这个问题困扰啊?我想我需要在手背上纹上“rake db:test:prepare”的纹身。 - aceofbassgreg

2
这里的重点是,rspec命令不会在测试数据库上执行迁移。而rake db:migrate只会在当前环境(一般是development)中运行迁移。其他环境,如productiontest,则没有进行这些更改。
您可以运行:
rake spec

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

另一个答案所建议的,这样做:

rake db:test:prepare

我也会设置测试数据库,但是你需要在此之后运行rspec命令,所以个人更喜欢第一种选项。


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)

我认为如果您添加一些解释您的意图,那么对于原帖作者和其他访问者来说会更有帮助。 - Reporter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接