RSpec instance_double respond_to?奇怪的行为

时间:2016-11-22 14:26:44

标签: ruby rspec rspec3

我有

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匹配器的功能还是错误?我应该使用接收匹配器吗?

1 个答案:

答案 0 :(得分:2)

instance_double基本上是creates a Struct instance

开箱即用它是一个对象,它对包装类一无所知。 receive扩展了stubs的属性。

所以是的,在这种情况下应该使用receive。更确切地说,不应该测试RSpec本身以及您正在做的是测试instance_double实现。