测试使用CanCan和Devise与RSpec的视图

far*_*noy 20 ruby rspec ruby-on-rails devise cancan

我试图测试一个简单的索引视图,其中包含以下代码:

- if can? :destroy, MyModel
  %th Options
Run Code Online (Sandbox Code Playgroud)

MyModelsController 有以下选项(继承资源+ CanCan + Devise):

class MyModelsController < ApplicationController
  inherit_resources
  nested_belongs_to :mymodel
  before_filter :authenticate_user!
  load_and_authorize_resource :project
  load_and_authorize_resource :mymodel, :through => :project
Run Code Online (Sandbox Code Playgroud)

运行规格时,它会在该行崩溃 - if can? :destroy, MyModel

Failure/Error: render
   ActionView::Template::Error:
      undefined method `authenticate' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

没有追溯,没有任何依据......

我想也许在测试视图时我没有被授权和签名,但是Devise::TestHelpers应该只包含在控制器测试中(这就是我的方法).

我试图覆盖方法可以吗?在两者Ability和控制器中,但没有产生任何影响.

zet*_*tic 29

这在控制器测试CanCan文档中有所描述,也可以修改为适用于查看规范.这是一种方法:

require 'spec_helper'

describe "mymodel/index.html.erb" do
  before(:each) do
    assign(:my_model,mock_model(MyModel))
    @ability = Object.new
    @ability.extend(CanCan::Ability)
    controller.stub(:current_ability) { @ability }
  end

  context "authorized user" do
    it "can see the table header" do
      @ability.can :destroy, MyModel
      render
      rendered.should have_selector('th:contains("Options")')
    end
  end

  context "unauthorized user" do
    it "cannot see the table header" do
      render
      rendered.should_not have_selector('th:contains("Options")')
    end
  end
end
Run Code Online (Sandbox Code Playgroud)


Hon*_*gli 5

zetetic发布的'before:each'代码对我不起作用.我对'can?'的看法很开心 方法因为视图中的'current_ability'返回nil.我使用这个'before:each'代码修改了它:

@ability = Ability.new(user)
assign(:current_ability, @ability)
controller.stub(:current_user, user)
view.stub(:current_user, user)
Run Code Online (Sandbox Code Playgroud)

上面的代码模拟了登录.


Joh*_*ian 5

在您的spec_helper中:

config.include Devise::TestHelpers, :type => :view
Run Code Online (Sandbox Code Playgroud)

在您看来:

controller.stub!(current_user: [some user])
view.stub!(current_user: [some user])
Run Code Online (Sandbox Code Playgroud)