2016-06-29 1 views
0

私はクラスUploaderを持っています。これはファイルを受け取り、それをS3にアップロードします。私は、upload_fileが呼び出されたときに@s3が実際にファイル本体を受け取っていることをテストしようとしています。 Fileがメッセージを送信していることをテストすると、テストに合格します。しかし、Aws::S3::Clientをスパイしようとすると動作しません。RSpecスパイは2つの異なるクラスで異なった働きをします

class Uploader 
    def initialize(tmp_dir_name, bucket) 
    @base_tmp_dir = tmp_dir_name 
    @s3 = Aws::S3::Client.new(region: 'us-east-1') 
    @bucket = bucket 
    @uploaded_assets = [] 
    end 

    def upload_file(key, file_path) 
    file = File.new(file_path) 
    @s3.put_object(bucket: @bucket, key: key.to_s, body: file.read) 
    end 
end 

RSpec.describe Uploader do 
    let(:bucket) { 'test_bucket' } 
    let(:base_temp_dir) { 'test_temp_dir' } 
    let(:uploader) { Uploader.new(base_temp_dir, bucket) } 

    describe "#upload_file" do 
    let(:file) { double('file') } 
    before { allow(File).to receive(:new) { file } } 
    before { allow(file).to receive(:read).and_return('text') } 
    before { allow(Aws::S3::Client).to receive(:put_object) } 

    it "uses one file" do 
     uploader.upload_file('test_key', 'file_path') 
     expect(File).to have_received(:new).with('file_path') 
    end 

    it "sends data to s3" do 
     uploader.upload_file('test_key', 'file_path') 
     expect(Aws::S3::Client).to have_received(:put_object) 
    end 
    end 
end 
+0

あなたのコードは:: '' AWS :: S3にput_object'を呼び出すClient'が、そのインスタンスにされていません。あなたのスパイに貧困クラスの質問を止めさせて、アップローダーインスタンスの '@ s3'インスタンス変数を解明させてください;) – Raffael

+0

' Aws :: S3 :: Client'サービス全体をモックしたいと思うでしょう。各テストの実行ごとにサーバーへの接続を確立します。 – Raffael

+0

@Raffaelありがとう!私はそれが問題かもしれないと思っていましたが、それがクラスのインスタンスに作用していると考えられるかどうか疑問に思っていました...私の脳は結び目にあります。 FWIW、私はAWSの組み込みのモックを使用しています。 –

答えて

0

私はこの特定のテストのためにs3を模擬しました。

it "sends data to s3" do 
     test_key = 'test_key' 
     bucket = 'test_bucket' 
     fake_s3 = instance_double(Aws::S3::Client) 
     allow(Aws::S3::Client).to receive(:new).and_return(fake_s3) 
     allow(fake_s3).to receive(:put_object) 

     uploader.upload_file(test_key, 'file_path', record=true) 
     expect(fake_s3).to have_received(:put_object).with(
     {bucket: bucket, key: test_key, body: 'text'}) 
    end 
関連する問題