Ruby on rails Rspec 3:can';不检查类类型

Ruby on rails Rspec 3:can';不检查类类型,ruby-on-rails,ruby,rspec,rspec-rails,Ruby On Rails,Ruby,Rspec,Rspec Rails,注意: class BaseValidator; end class DefaultValidator < BaseValidator; end 给我打印这个: Failure/Error: it {is_expected.to be_a(DefaultValidator)} expected DefaultValidator to be a kind of DefaultValidator Failure/Error: it {is_expected.to be_kind_of

注意:

class BaseValidator; end
class DefaultValidator < BaseValidator; end
给我打印这个:

Failure/Error: it {is_expected.to be_a(DefaultValidator)}
   expected DefaultValidator to be a kind of DefaultValidator

Failure/Error: it {is_expected.to be_kind_of(BaseValidator) }
   expected DefaultValidator to be a kind of BaseValidator
然而,这是可行的:

...
    it {is_expected.to be(DefaultValidator)}
    it {is_expected.to be < (BaseValidator) }
...
现在,我在RSpec文档中找不到关于类类型机器的be()和be<的任何信息


我是否以错误的方式使用了“be_a”和“be_kind of”?

您的验证程序方法正在返回
和/或
BaseValidator
。 换句话说,这些不是这些类的实例,但它们的类是
class

be_a
be_a_种类
用于断言对象是传递给它们的类或模块参数的实例


这就是为什么第一个代码示例失败,但第二个代码示例通过。第二个代码段是测试
Class
实例,而不是验证程序的实例。

查看
ValidatorFactory.validator的实现会有所帮助。有关失败的两个匹配器的文档,请参阅。@PeterAlfvin,添加了ValidatorFactory.validator的实现。
...
    it {is_expected.to be(DefaultValidator)}
    it {is_expected.to be < (BaseValidator) }
...
class ValidatorFactory
    def self.validator(type)
    case type.downcase
    when 'default'
        DefaultValidator
    else
        BaseValidator
    end
end