检查RSpec返回类引用?

时间:2016-03-29 03:03:13

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

说我已经按照这些方式定义了一个Ruby类:

class Blah
  def self.ref_class
    ::Other::Thing
  end
end

.ref_class返回一个类引用(这就是它所谓的,对吧?)。如何使用RSpec测试此方法?

2 个答案:

答案 0 :(得分:1)

它只是一个正常的返回值,如"hello";但是班级Class。所以只需检查函数是否返回它应该的值。在这种情况下,您expect(Greeting.in_morning).to eq "hello" expect(Blah.ref_class).to eq ::Other::Thing

答案 1 :(得分:0)

实施例

确保它是Class

expect(Blah.ref_class.class).to eq(Class)

确保它扩展另一个类或包含其他模块

expect(Blah.ref_class.ancestors).to include(SuperClass)

确保它是特定类

使用Amadan的答案。这是一个例外。

expect(Blah.ref_class).to eq(::Other::Thing)

确保它是特定类的实例

expect(Blah.new).to be_an_instance_of(Blah)

确保它是特定类或其子类之一的实例

expect(Blah.new).to be_an(Object) # or one of `be_a` `be_a_kind_of`

背景

在Ruby中,类的类是Class。

class Sample
end

Sample.class #=> Class
Sample.class.ancestors #=> [Class, Module, Object, Kernel, BasicObject]

的祖先

在Ruby中,扩展类和包含或前置的模块是祖先列表的一部分。

module IncludedModule
end

module PrependedModule
end

class Sample
  include IncludedModule
  prepend PrependedModule
end

Sample.ancestors #=> [PrependedModule, Sample, IncludedModule, Object, Kernel, BasicObject]

实例

在Ruby中,实例的类是类。

Sample.new.class #=> Sample

检查实例是否完全是指定的类。

Sample.new.class == Sample #=> true # what be_an_instance_of checks.
Sample.new.instance_of? Sample #=> true
Sample.new.class == IncludedModule #=> false
Sample.new.instance_of? IncludedModule #=> false

检查实例的类是否是完全指定的类或其子类之一。

Sample.new.kind_of? IncludedModule #=> true # Same as #is_a?
Sample.new.class.ancestors.include? IncludedModule #=> true