Ruby on rails 3 使用Desive的RSpec测试:找不到有效的映射
我正在尝试使用Desive 1.3.4运行控制器规范。(和工厂女孩) 我按照GitWiki中的说明进行项目。我可以使用宏中创建的login_user方法以用户身份登录,但login_admin失败,出现以下错误:Ruby on rails 3 使用Desive的RSpec测试:找不到有效的映射,ruby-on-rails-3,rspec,devise,Ruby On Rails 3,Rspec,Devise,我正在尝试使用Desive 1.3.4运行控制器规范。(和工厂女孩) 我按照GitWiki中的说明进行项目。我可以使用宏中创建的login_user方法以用户身份登录,但login_admin失败,出现以下错误: ... sign_in Factory.create(:admin) Could not find a valid mapping for #<User id: 2023, email: "admin1@gmail.com", .... > 控制器宏模块: module
...
sign_in Factory.create(:admin)
Could not find a valid mapping for #<User id: 2023, email: "admin1@gmail.com", .... >
控制器宏模块:
module ControllerMacros
def login_admin
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user] #it should map to user because admin is not a model of its own. It produces the same result either way.
@admin = Factory.create(:admin)
sign_in @admin
end
end
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
@user = Factory.create(:user)
sign_in @user
end
end
end
路线
devise_for :users
devise_for :admins, :class_name => 'User'
一种解决方案是设置cache_classes=false,但这并不理想,因为我使用spork,不想在更改模型后重新启动它
有什么帮助吗?这是Deave自述: 还设计带有默认路线的船舶。 如果您需要自定义它们,您可以 应该能做到 通过设计方法。信息技术 接受以下几个选项: :class\u name、:path\u前缀等, 包括改变的可能性 I18n的路径名 因此,我会检查您的routes文件并确保该文件在其中:
devise_for :admins, :class_name => 'User'
我的路线上有这样的东西:
devise_for :accounts, :controllers => {:confirmations => "confirmations"} do
put "confirm_account", :to => "confirmations#confirm_account"
get "login" => "devise/sessions#new", :as => :login
delete "logout" => "devise/sessions#destroy", :as => :logout
get "register" => "devise/registrations#new", :as => :register
end
因此,在我的spec/support/controller_macros.rb中,我需要更改为:
def login_account
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:account]
@account = Factory.create(:account)
sign_in(@account)
end
end
到
注意登录(范围、资源)
我希望这会有所帮助。您可能希望检查代码中不同位置的多个
管理员声明。在我的案例中,这就是导致这种异常的原因,因为它肯定会混淆Desive。顺便说一句,它位于“配置路由”下的自述文件中。我认为这与路线无关,但显然我误解了。谢谢我的问题与海报上的问题相同,将登录行更改为sign_-in:user,Factory(:admin)对我有效
def login_account
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:account]
@account = Factory.create(:account)
sign_in(@account)
end
end
def login_account
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:account]
@account = Factory.create(:account)
sign_in(:account, @account)
end
end