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



我有一个类结构,看起来像这样:

module MyModule
    class MyOuterClass
        class MyInnerClass
        end
    end
end

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

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

我得到错误"你必须传递一个参数而不是一个块来使用提供的匹配器。"此外,类在另一个位置,所以我不能只检查

[...] be_an_instance_of(MyInnerClass)

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

不要传递Block

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

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

expect(@instance_of_MyInnerClass).to be_a MyInnerClass

最新更新