2017-11-22 10 views
2

rspec-rails(3.7.0)でjruby(9.1.12.0)を使用しています。動的に生成されるモッキングオブジェクト+ rspec-mock

私は次のような方法

class AddressCreator 
    include Singleton 
    attr_reader :client 

    def initialize 
    @client = SomeJavaClass.new(some keys go here)  
    end 
end 

# SomeJavaClass has an create_address instance method. 

def create_address(user_id, address) 
    req = Java::RandomRequest.new(user_id, address) 
    resp = Java::RandomResponse.new(default_response_params) 
    AddressCreator.instance.client.create_address(some_key, req, resp) 
end 

を持っており、

describe '#create_address' do 
    let(:some_key) { SecureRandom.uuid } 
    let(:user_id) { 1 } 
    let(:default_response_params) { false } 
    let(:address) { 'some address goes here' } 
    let(:request) { Java::RandomRequest.new(address)} 
    let(:response) { Java::RandomResponse.new(default_response_params)} 

    before {allow(AddressCreator.instance.client).to receive(:create_address).with(some_key, request, response).and_return(response)} 

    it 'should create the address' do 
    result = AddressCreator.instance.client.create_address some_key 
    expect(AddressCreator.singleton).to have_received(:create_address).with(some_key, request, response) do |request| 
     expect(request.is_success).to eq(response.is_success) 
    end 
    expect(result).to eq(response) 
    end 
end 

は私のスペックは、私たちが、我々をあざけりにはどうすればよい

expected <Java::RandomRequest:0x1d09fb8e> 
got  <Java::RandomRequest:0x38482732> 

を述べ失敗するのと同じのためのテストを追加しました同じインスタンスを受け取りましたか?

答えて

1

仕様で作成するJava::RandomRequestおよびJava::RandomResponseのインスタンスは、create_addressで作成したインスタンスと一致しません。

# no before block 
it 'should create the address' do 
expect(AddressCreator.singleton) 
    .to receive(:create_address) 
    .with(some_key, request, response) do |request| 
    expect(request.is_success).to eq(response.is_success) 
    end 
    result = AddressCreator.instance.client.create_address some_key 
    expect(result).to eq(response) 
end 
:あなたが create_addressアクションの前に呼ばれるスパイ、例えばへ create_addressコールの後 expect... have_receivedbeforeallowを折りたたむことができ、また

let(:request) { instance_double(Java::RandomRequest) } 
let(:response) { instance_double(Java::RandomResponse) } 
before do 
    allow(Java::RandomRequest).to receive(:new).and_return(request) 
    allow(Java::RandomResponse).to receive(:new).and_return(response) 
end 

: あなたが好き必要な値を返すためにクラスをスタブ試してみてください

リクエストとレスポンスがどのようにして正確に初期化されているかを確認したくない場合は、kind_of/instance_of/duck_type引数マッチャーをスタブの代わりに使用することもできます。何かのように: let(:some_key) { double }

# no before 
it 'should create the address' do 
    expect(AddressCreator.singleton).to receive(:create_address) 
    .with(kind_of(String), instance_of(Java::RandomRequest), duck_type(:is_success)) do |request| 
    expect(request.is_success).to be_true 
    end 
    AddressCreator.instance.client.create_address some_key 
end 

最後に、あなたが処理し、終了間際には、いくつかのスタブクラスに合格しない場合は、二重は十分だろう、本当の安全な鍵とsome_keyを初期化する必要はありません。

関連する問題