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

我有一个类似于以下的类结构:

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是一个未初始化的常量。 所以,我想问一下如何使用RSpecvalidation变量是否是MyInnerClass的实例。

不要通过一个街区

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。 您当然可以传递其他本地或实例变量,但在这种情况下, 主题已经为您定义为MyModule::MyOuterClass::MyInnerClass.new

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

 expect(@instance_of_MyInnerClass).to be_a MyInnerClass