需要设计rspec模型规范

时间:2013-11-11 19:11:31

标签: ruby-on-rails ruby ruby-on-rails-3 rspec devise

我在我的Admin模型中使用了这样的设计:

class Admin < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable
end

从功能上来说,这很好。但是我希望我的Admin类有规格,所以我开始写一个规范......

require 'spec_helper'
require 'admin'

describe Admin do
  it 'mumblemumble' do ... end
end

...然后当我去运行规范时,它会爆炸:

active_record/dynamic_matchers.rb:22:in `method_missing': undefined method `devise' for Admin(Table doesn't exist):Class (NoMethodError)

我如何要求Devise以便在我的规范中提供?好像我应该能够

require 'devise'

在我的规范或我的模型中(最好是我的模型),但这不能解决问题或改变我的堆栈跟踪。我如何要求Devise以便我的模型具有辅助方法?我在寻找Devise宝石,但我找不到任何线索。

4 个答案:

答案 0 :(得分:1)

你是如何运行这些的? RSpec直接?或bundle exec rake spec

你的错误就是这个:for Admin(Table doesn't exist)让我想知道你是否还有一个数据库。 rake任务应该照顾你的世界。

如果这样做无效,请发布您的spec_helper.rb内容。

这是我的基本管理模型:

class Admin < ActiveRecord::Base
  devise :database_authenticatable, :recoverable, :rememberable,
         :trackable, :validatable
end

基本规范:

require 'spec_helper'

describe Admin do
  it { should validate_uniqueness_of(:email) }
end

与vanilla生成的rails应用程序和生成的设计设置配合使用。

答案 1 :(得分:1)

此错误

undefined method `devise' for Admin(Table doesn't exist):Class (NoMethodError)

似乎是你没有db中的表?您是否迁移了rake文件?

答案 2 :(得分:1)

是的,您的测试数据库似乎没有admins表。 试试这个:

bundle exec rake db:migrate db:test:prepare

db:migrate迁移您的开发数据库,​​如果有任何待处理的迁移,db:test:prepare根据开发数据库克隆您的测试数据库。

答案 3 :(得分:0)

知道了。我使用内存中的sqlite3实例运行specs,因此所有db:test:prepare都不适用于我。除了要求Devise之外,它还必须是setup/configured

所以在/spec/support/devise.rb

require 'devise'

Devise.setup do |config|
  require 'devise/orm/active_record'
end

然后在spec_helper.rb中:

Dir["./spec/support/**/*.rb"].sort.each {|f| require f}