观察:
class BaseValidator; end
class DefaultValidator < BaseValidator; end
Rspec 3.1:
describe ValidatorFactory do
context "creating DefaultValidator" do
subject { ValidatorFactory.validator('default') }
it {is_expected.to be_a(DefaultValidator)}
it {is_expected.to be_kind_of(BaseValidator) }
end
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) }
...
ValidatorFactory.rb
class ValidatorFactory
def self.validator(type)
case type.downcase
when 'default'
DefaultValidator
else
BaseValidator
end
end
现在,我找不到关于be()的任何意思并且&lt;用于RSpec文档中的类类型加工。
我是以错误的方式使用“be_a”和“be_kind_of”吗?
答案 0 :(得分:5)
您的验证方法返回类 DefaultValidator
和/或BaseValidator
。
换句话说,那些不是那些类的实例,但它们的类是Class
。
be_a
和be_a_kind_of
matchers用于声明对象是传递给它们的Class或Module参数的实例。
这就是你的第一个代码示例失败的原因,但第二个代码示例失败了。第二个代码段是测试Class
个实例,而不是验证器的实例。