2014-12-26 2 views
0

Если я использую проверочный двойной (object_double), как я издеваюсь над классом объекта, так что === работает?Как насмехаться над классом Rspec Verifying double

Например, если мой код выглядит следующим образом:

def foo(record) 
    case record 
    when Bar 
    OtherObject.call 
    end 
end 

Это не работает:

it 'should call OtherObject if record is instance of Bar' 
    record = object_double(Bar.new, class: Bar) 
    expect(OtherObject).to receive(:call) 
    foo(record) 
end 

ответ

1

Пока вы насмешливый class метод вашего record объекта, код тестируемой использует оператор case, который опирается на метод ===Bar. Оператор === описывается неофициально с точки зрения того, является ли аргумент «видом» данного класса, но нет никаких гарантий того, что реализация будет использовать kind_of? или is_a? или class или любой другой конкретный метод. CRuby 2.1.5, в частности, реализуется следующим образом:

   static VALUE 
rb_mod_eqq(VALUE mod, VALUE arg) 
{ 
    return rb_obj_is_kind_of(arg, mod); 
} 

Таким образом, я думаю, что единственный способ, которым Вы можете быть уверены в том, что код тестируемой будет работать, чтобы издеваться оператор === из Bar следующим образом:

describe 'stack overflow question' do 
    it 'should call OtherObject if record is instance of Bar' do 
    record = double 
    allow(Bar).to receive(:===).with(record).and_return(true) 
    expect(OtherObject).to receive(:call) 
    foo(record) 
    end 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^