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)
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)
上面的代码模拟了登录.
在您的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)