【问题标题】:Simple rspec test of initialize, include and class variable existance初始化、包含和类变量存在的简单 rspec 测试
【发布时间】:2013-09-19 17:26:21
【问题描述】:

我现在正在学习 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

谁能提供一个例子。我做了一个研究,但没有成功....

【问题讨论】:

  • 在检查包含(第一个 NoMethodError)时应该使用should be_a_kind_of,在检查(第 2 种情况)的实例时应该使用 should be_instance_of...
  • 对于第二种情况,您还应该将attr_accessor :user 定义为Ability 或定义user 方法,返回@user
  • 对第二条评论:我需要attr_accessor :user 吗?还是在initialize(user) 方法中就足够了?这样做有什么理由?目前我对此的测试如下:ability.instance_variable_get(:@user).should be_an_instance_of User
  • 不,initialize 还不够。

标签: ruby ruby-on-rails-3 rspec devise


【解决方案1】:

第一个问题 => 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

【讨论】:

    【解决方案2】:

    如果您正在学习和玩耍,像这样测试 CanCan 并没有什么坏处。但是,如果您正在处理项目,则无需进行这些测试。

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

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

    【讨论】:

    • 我最终得到:it 'should include the CanCan::Ability to work proberly' do ability.should be_a_kind_of(CanCan::Ability) end
    • 简,没关系。您仍然需要努力测试集成效果:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2015-04-12
    • 2014-09-19
    • 1970-01-01
    • 2016-12-12
    • 2013-11-10
    • 2012-12-13
    相关资源
    最近更新 更多