Stub或模拟实例方法rspec

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

以下功能是一个控制器操作,并从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

ruby-on-rails ruby amazon-s3 rspec rspec-rails
1个回答
0
投票

而不是存根Zlib::GzipReaderS3 Bucket。处理此类情况的一种简单方法是在控制器中创建一个新的私有函数,然后对控制器函数进行存根。

在控制器端:

def show
  render json: s3_response
end

private:

def s3_response
   Zlib::GzipReader.new(ApiBucket.bucket.object(id).get.body).read
end

规格将是:

   describe '#GET show' do
  let!(:resource) { create(:resource) }

  before do
    json_data = Api::V2::Presenter.consume_as_json(resource)
    ResourceController.any_instance.stub(:s3_response).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::Presenter.new(resource).page,
        true
      )
    expect(response_body_json).to eql(JSON.parse(json_data))
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.