我有
let(:ssl_socket) { instance_double(OpenSSL::SSL::SSLSocket) }
现在我想测试我拥有的对象是否是OpenSSL :: SSL :: SSLSocket的实例。我不想使用be_an_instance_of matcher,因为我希望我的测试更像是" duck typing"办法。所以我想知道对象是否响应了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将实际检查:是否在OpenSSL :: SSL :: SSLSocket实例中存在ssl_version方法。这是RespondTo匹配器的功能还是错误?我应该使用接收匹配器吗?
答案 0 :(得分:2)
instance_double
基本上是creates a Struct
instance。
开箱即用它是一个对象,它对包装类一无所知。 receive
扩展了stubs
的属性。
所以是的,在这种情况下应该使用receive
。更确切地说,不应该测试RSpec
本身以及您正在做的是测试instance_double
实现。