Ruby on rails 3 使用Desive的RSpec测试:找不到有效的映射

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

我正在尝试使用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 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