2014-11-17 71 views
2

觀察:Rspec的3:無法檢查類類型

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 

現在,我找不到anythyng約是(),並在RSpec的文檔類類型MACHING是<。

我是否以錯誤的方式使用「be_a」和「be_kind_of」?

+0

這將有助於看到'ValidatorFactory.validator'的實現。請參閱https://www.relishapp.com/rspec/rspec-expectations/v/3-1/docs/built-in-matchers/type-matchers,瞭解失敗的兩個匹配器的文檔。 –

+0

@PeterAlfvin,添加了ValidatorFactory.validator的實現。 – user1463822

回答

4

驗證器方法正在返回DefaultValidator和/或BaseValidator。 換句話說,那些類不是這些類的實例,但它們的類是Class

be_abe_a_kind_ofmatchers是斷言的目標是一實例被傳遞給它們的類或模塊的說法

這就是爲什麼你的第一個代碼示例失敗,但第二個通過。第二個代碼片段正在測試Class實例,而不是驗證器的實例。