如何使用rspec检查变量是否是模块子类的实例?

时间:2014-06-10 15:06:11

标签: ruby rspec module instance subclass

我有一个如下所示的类结构:

module MyModule

    class MyOuterClass

        class MyInnerClass

        end

    end

end

我试图确保使用Rspec将变量正确地实例化为MyInnerClass。打印类的类型,它是MyModule :: MyOuterClass :: MyInnerClass。但是,如果我尝试运行该行

expect{@instance_of_MyInnerClass}.to be_an_instance_of(MyModule::MyOuterClass::MyInnerClass)

我收到错误"您必须传递参数而不是块才能使用提供的匹配器。"此外,课程在另一个地方,所以我不能检查

[...] be_an_instance_of(MyInnerClass)

Rspec抱怨MyInnerClass是一个未初始化的常量。所以,我想问一下如何使用RSpec验证变量是否是MyInnerClass的实例。

2 个答案:

答案 0 :(得分:1)

不要通过一个座位

Rspec 3.x使用expect 方法而不是块语法(请参阅RSpec 3 Expectations 3.0)。要使规范通过并进行清理,您可以使用以下命令:

module MyModule
  class MyOuterClass
    class MyInnerClass
    end
  end
end

describe MyModule::MyOuterClass::MyInnerClass do
  it "is correctly instantiated" do
    expect(subject).to be_an_instance_of MyModule::MyOuterClass::MyInnerClass
  end
end

注意使用隐式主题,作为参数传递给#expect。您当然可以传递其他本地或实例变量,但在这种情况下, subject 已经为您MyModule::MyOuterClass::MyInnerClass.new定义。

答案 1 :(得分:0)

我们大多数人都使用首选的Rspec语法,因此它将是:

expect(@instance_of_MyInnerClass).to be_a MyInnerClass