尝试测试(最小测试)调用AWS S3 Bucket copy_to的方法。如何模拟或存根?

问题描述 投票:0回答:1

我们有一个带有

copy_for_edit!
方法的附件模型,可以帮助附件复制自身。附件数据存储在 AWS S3 存储桶中。我们利用 Bucket
copy_to
技术在 AWS S3 服务器上远程执行复制,而不将数据传回给我们。 https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Object.html#copy_to-instance_method

我正在为此方法编写一个单元测试(在 minitest 中),并得到由

Aws::S3::Bucket#copy_to
实例方法引起的错误:

Aws::S3::Errors::NoSuchKey:         Aws::S3::Errors::NoSuchKey: The specified key does not exist.

我见过无数关于如何存根 AWS S3 客户端的解决方案,但没有看到存储桶的存根解决方案。我确信我在这里遗漏了一些简单的东西。代码本身可以在暂存和生产中运行,但在我的开发环境中进行测试时,我显然不希望使用 AWS S3 服务器。但即使我将测试环境配置为使用存储桶的暂存凭据,这也不起作用(相同的错误)。

我想知道如何在 minitest 中对

Aws::S3::Bucket#copy_to
实例方法进行存根(或类似)。

我知道我遗漏了一些细节。我将密切关注这一点,并根据需要进行编辑以添加上下文。

编辑 1:测试的简化版本如下所示:

test '#copy_for_edit! should copy the attachment, excluding some attributes' do
  source = attachments(:attachment_simple)  #From an existing fixture.
  result = nil

  assert_difference(-> { Attachment.count }, 1) do
    result = source.copy_for_edit!
  end

  assert_nil(result.owner)
  assert_nil(result.draft_id)
end
ruby-on-rails amazon-s3 minitest stub
1个回答
0
投票

将其范围缩小到实例方法(而不是类方法或属性)帮助我缩小了选择范围。 我终于得到了正确的语法,并且相信我现在已经有了一个有效的测试。

这基本上是我的解决方案:https://stackoverflow.com/a/29042835/14837782

我不能说我已经存根了 AWS S3

Bucket#copy_to
方法。实际上,我只是对最终调用它的我们自己的方法(
copy_attached_file_to
)进行了存根,因为我实际上并没有测试该方法。当需要测试该方法时,我可能会遇到类似的麻烦。尽管也许这个解决方案可以类似地对 Bucket 进行存根操作。

现在是测试,看起来工作正常:

  test '#copy_for_edit! should copy the attachment, excluding some attributes' do

    source = attachments(:attachment_simple)  # From an existing fixture.
    source.stub(:copy_attached_file_to, true) do
      result = nil

      assert_difference(-> { Attachment.count }, 1) do
        result = source.copy_for_edit!
      end

      assert_nil(result.owner)
      assert_nil(result.draft_id)
    end
  end
© www.soinside.com 2019 - 2024. All rights reserved.