【发布时间】:2019-10-21 07:54:48
【问题描述】:
以下函数是一个控制器操作,用于从 AWS S3 存储桶获取要提供的数据。
def show
s3_response = Zlib::GzipReader.new(ApiBucket.bucket.object(id).get.body).read
render json: s3_response
end
我正在为此方法编写规范。我需要存根/模拟,以使s3_response 实际上并不向 s3 请求。这是我尝试过的。但这不起作用。请帮忙。
describe '#GET show' do
let!(:resource) { create(:resource) }
before do
json_data = Api::V2::Presenter.consume_as_json(resource)
allow_any_instance_of(Zlib::GzipReader).to receive(:read).and_return(json_data)
end
it 'should return the resource in page format' do
get :show, format: :json, params: { id: resource.uuid }
response_body_json = JSON.parse(response.body)
json_data = Api::V2::Presenter.consume_as_json(
Api::V2::ResourcePresenter.new(resource).page,
true
)
expect(response_body_json).to eql(JSON.parse(json_data))
end
end
我收到此错误Zlib::GzipFile::Error: not in gzip format
【问题讨论】:
-
似乎
ApiBucket.bucket.object(id).get.body发出 S3 请求。你可能应该存根那个。 -
我不需要吧?不管它是什么反应,我无论如何都会存根
Zlib::GzipReader。那么这有什么关系呢? -
Ruby 仍然计算
ApiBucket.bucket.object(id).get.body并将其返回值传递给Zlib::GzipReader.new。然后它调用该对象的read方法,该方法返回存根响应。所以存根Zlib::GzipReader#read不会阻止ApiBucket从 S3 获取原始数据。 -
没有这样做,而是编写了一个私有控制器,然后将该函数存根
-
签出 AWS SDK 文档 aws.amazon.com/blogs/developer/…
标签: ruby-on-rails ruby amazon-s3 rspec rspec-rails