2016-11-22 15 views
0

は、私は私が持っているオブジェクトには、OpenSSL :: SSL ::のSSLSocketのインスタンスであるかどうかをテストしたい今 RSpec instance_double respond_to?奇妙な行動

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

を持っています。 be_an_instance_of matcherを使用したくないのです。なぜなら私のテストでは "ダックタイピング"のようにチェックする必要があるからです。だから私は、その後InstanceDouble意志オブジェクトが「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 

を使用しないかどうかを知りたいです実際には:ssl_versionメソッドがOpenSSL :: SSL :: SSLSocketインスタンスに存在するかどうかをチェックします。これはRespondTo matcherの機能かバグですか? Receive matcherを使うべきですか?

+0

あなたの 'let'文に基づいて' socket'を 'ssl_socket'にしてはいけませんか? – engineersmnky

+0

はい、それをテストしたい、つまり 'do_some_stuff'の後に' socket'(または正確には 'object.socket')を' ssl_socket'に設定する必要がありますが、 'nil'でもかまいません。 –

答えて

2

instance_doubleフードの下には基本的にcreates a Struct instanceです。

そのままの状態で、ラップされたクラスについては何も知らないオブジェクトです。 receiveはそれのstubs属性を拡張します。

はい、この場合はreceiveを使用してください。より正確に言えば、RSpec自体をテストしてはならないし、何をしているのかは、instance_doubleの実装をテストすることです。

+0

ありがとうございます。 'respond'が' instance_double'の場合を扱わない(スタブを拡張したり、引数を何らかの形で渡さないようにする)のはややこしいです。つまり、誰かが 'instance_double'実装をテストする方法がないということです。 –