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
あなたのコードは:: '' AWS :: S3にput_object'を呼び出すClient'が、そのインスタンスにされていません。あなたのスパイに貧困クラスの質問を止めさせて、アップローダーインスタンスの '@ s3'インスタンス変数を解明させてください;) – Raffael
' Aws :: S3 :: Client'サービス全体をモックしたいと思うでしょう。各テストの実行ごとにサーバーへの接続を確立します。 – Raffael
@Raffaelありがとう!私はそれが問題かもしれないと思っていましたが、それがクラスのインスタンスに作用していると考えられるかどうか疑問に思っていました...私の脳は結び目にあります。 FWIW、私はAWSの組み込みのモックを使用しています。 –