我在我的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宝石,但我找不到任何线索。
答案 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}