2016-11-22 4 views
0

У меняRSpec instance_double reply_to? странное поведение

let(:ssl_socket) { instance_double(OpenSSL::SSL::SSLSocket) } 

Теперь я хочу, чтобы проверить, если объект у меня есть экземпляр OpenSSL :: SSL :: SSLSocket. Я не хочу использовать be_an_instance_of matcher, потому что я хочу, чтобы мой тест больше походил на «утиный набор». Так что я хочу знать, если объект отвечает «ssl_version» метод

it 'should change socket to ssl' do 
    #do some stuff and set socket = ssl_socket 
    expect(socket).to respond_to(:ssl_version) 
end 

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

expected #<InstanceDouble(OpenSSL::SSL::SSLSocket) (anonymous)> to respond to :ssl_version 

Но если я сделать это с помощью других Искателя

it 'should change socket to ssl' do 
    #do some stuff and set socket = ssl_socket 
    expect(socket).to receive(:ssl_version) 
    socket.ssl_version 
end 

затем InstanceDouble будет на самом деле проверьте, существует ли метод ssl_version в экземплярах OpenSSL :: SSL :: SSLSocket. Является ли это признаком или ошибкой ответчика? Должен ли я использовать приемник?

+0

не должен 'socket' быть' ssl_socket' на основе вашего 'let' утверждения? – engineersmnky

+0

Да, и я хочу проверить это, то есть после 'do_some_stuff'' socket' (или 'object.socket', если быть точным) следует установить' ssl_socket', но это также может быть 'nil'. –

ответ

2

instance_double в основном creates a Struct instance под капотом.

Из коробки это объект, который ничего не знает об обернутом классе. receive extends stubs атрибут.

Так что да, в этом случае следует использовать receive. Точнее, не следует тестировать RSpec и что вы делаете, это тестирование instance_double.

+0

Благодарим вас, хотя это неловко для 'response' не обрабатывать случай' instance_double' (не расширять 'stub' или передавать аргументы каким-то образом). Я имею в виду, что кто-то не хочет протестировать реализацию 'instance_double'. –

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

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