2015-11-06 79 views
2

我有一個類使用the aws-sdk-rails gem(這是aws-sdk-ruby v2的包裝)讀取/處理來自SQS隊列的消息。我如何模擬AWS調用,以便我可以測試我的代碼而不碰到外部服務?如何使用rspec模擬AWS SDK(v2)?

communicator.rb

class Communicator 
    def consume_messages 
    sqs_client = Aws::SQS::Client.new 
    # consume messages until the queue is empty 
    loop do 
     r = sqs_client.receive_message({ 
               queue_url: "https://sqs.region.amazonaws.com/xxxxxxxxxxxx/foo", 
               visibility_timeout: 1, 
               max_number_of_messages: 1 
            }) 
     break if (response.message.length == 0) 
     # process r.messages.first.body 
     r = sqs_client.delete_message({ 
             queue_url: "https://sqs.region.amazonaws.com/xxxxxxxxxxxx/foo", 
             receipt_handle: r.messages.first.receipt_handle 
            }) 
    end 
    end 
end 
+0

這個老問題解決了同樣的問題:http://stackoverflow.com/questions/16380426/how-to-mock-aws-sdk-gem。但是,它是關於殘留,n嘲笑。 –

回答

4

我有一個很難找到的例子嘲諷的AWS資源。我花了幾天的時間搞清楚,並希望分享Stack Overflow的結果作爲後代。我用rspec-mocksdoubles & verifying doubles)下面是在問題的communicator.rb例子爲例

communicator_spec.rb:。

RSpec.describe Communicator do 
    describe "#consume_messages" do 
    it "can use rspec doubles & verifying doubles to mock AWS SDK calls" do 
     sqs_client = instance_double(Aws::SQS::Client) 
     allow(Aws::SQS::Client).to receive(:new).and_return(sqs_client) 
     SQSResponse = Struct.new(:messages) 
     SQSMessage = Struct.new(:body, :receipt_handle) 
     response = SQSResponse.new([SQSMessage.new(File.read('data/expected_body.json'), "receipt_handle")]) 
     empty_response = SQSResponse.new([]) 
     allow(sqs_client).to receive(:receive_message). 
          and_return(response, empty_response) 
     allow(sqs_client).to receive(:delete_message).and_return(nil) 

     Communicator.new.consume_messages 
    end 
    end 
end 
+0

您也可以這樣做:'allow_any_instance_of(AWS :: SQS :: Client).to receive(:receive_message).and_return(response,empty_response)' – JAWspeak

+0

嘗試覆蓋類,使用'class_doubles'和wayyyy很多時間 - 這是我能找到的唯一方法,它不會給你雙重泄漏問題,而且只會影響正常工作。謝謝。 –