Метод заглушки или макета экземпляра rspec - PullRequest
1 голос
/ 21 октября 2019

Следующая функция является действием контроллера и получает данные для обслуживания из корзины 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

1 Ответ

2 голосов
/ 21 октября 2019

Вместо заглушки Zlib::GzipReader или S3 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
...