0

我现在正在学习 rspec,并想通过“设计”来测试我的能力课程,该代码如下:

class Ability
  include CanCan::Ability

  def initialize(user)

    @user = user || User.new

我当前的 rspec 如下所示:

require 'spec_helper.rb'

describe Ability do

  let(:user) { User.new }
  let(:ability) { Ability.new(user) }

  it 'should be an instance of Abiliy' do
    # expect(@user).to be_an_instance_of User # also works
    ability.should be_an_instance_of Ability
    # passes test
  end

  it "should include CanCan::Ability" do
    expect(:ability).to include(CanCan::Ability)
    # NoMethodError: undefined method `include?'
  end

  it 'should initialize with a User' do
   pending
  end

  it 'should have @user instance variable' do
    ability.user.should == User
    # NoMethodError: undefined method `user'

  end

有人可以提供一个例子。我做了一个研究,但没有成功......

4

2 回答 2

2

第一个问题 =>include匹配器适用于任何响应的对象include?(例如字符串或数组)

module M;end

class C
  include M
end

class D;end

C.new.include?(M)
NoMethodError: undefined method `include?' for #<C:0x2c5fa58>
     from (irb):10
     from C:/Ruby200/bin/irb:12:in `<main>'

C.include?(M)  #=>true
D.include?(M)  #=>false
C.respond_to?(:include?) #=>true
C.new.respond_to?(:include?) #=>false
于 2013-09-19T17:37:33.930 回答
0

如果您正在学习和玩耍,那么像这样测试 CanCan 并没有什么坏处。但是,如果您正在处理一个项目,这些测试是不必要的。

CanCan 中很好地涵盖了单元测试,特别是spec/cancan/ability_spec.rb. 您所做的是以另一种方式复制 Ryan 的工作 :) 您还可以打开 gem 并查看它是如何进行测试的。

对于使用 CanCan,我的建议是在控制器级别测试集成效果,说您不允许某些角色读取,然后 GET 它并被拒绝,等等。

于 2013-09-19T18:31:28.807 回答