存根 AWS S3 对象请求

Ccy*_*yan 6 testing ruby-on-rails amazon-s3 amazon-web-services aws-sdk-ruby

我正在尝试阻止在 AWS 存储桶中获取对象的请求。我已经阅读了他们关于存根请求的文档,并且只能存根一个存储桶,而不是一个对象。这是我尝试过的一些事情:

通过 AWS 配置进行存根:

Aws.config[:s3] = {
  stub_responses: {
    list_buckets: {
      buckets: [name: "my-bucket"],
      list_objects: [key: "file.pdf"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

虽然它得到了桶,但它没有给我对象。调用s3.buckets会列出存储桶,但s3.objects会是空的。

通过 gem 进行存根webmock

tempfile = file_fixture('file.pdf').read
base_uri = Regexp.new "https://my-bucket.s3.us-west-1.amazonaws.
stub_request(:get, base_uri).to_return(status: 200, body: tempfile)
Run Code Online (Sandbox Code Playgroud)

这似乎仍然不起作用。调用bucket.objects仍然返回一个空集合。

我想测试控制器中的代码:

s3 = Aws::S3::Resource.new
bucket = s3.bucket("my-bucket")
@files = {}

bucket.objects.each do |item|
  @files[File.basename(item.key)] = item.presigned_url(:get)
end
Run Code Online (Sandbox Code Playgroud)

目标是我想确保我的视图显示变量中对象的链接@file,并且我想测试该链接。任何帮助将不胜感激!我是使用 AWS S3 进行开发的新手,并且 google 没有提供太多帮助。我正在使用aws-sdk-s3gem 来处理 AWS S3。

Ccy*_*yan 6

弄清楚了。我还需要删除该#list_objects方法才能获取对象。最终的存根看起来像这样:

Aws.config[:s3] = {
  stub_responses: {
    list_buckets: {
      buckets: [name: "my-bucket"]
    },
    list_objects: {
      contents: [{key: "mykey"}]
    },
    get_object: {
      body: file_fixture('file').read
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做,s3.buckets.first.objects.first我会取回存根对象。