Как правильно макетировать объекты в RSpec? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть простой класс, который генерирует URL-адрес загрузки для файла, хранящегося на S3, и мне нужно написать модульный тест для проверки этого класса.Пока что мне не повезло.

class S3DownloadUrlGenerator
  def initialize(filename)
    @filename = filename
  end

  def presigned_url
    signer = Aws::S3::Presigner.new(client: s3)
    signer.presigned_url(
      :get_object,
      bucket: "my-bucket",
      key: filename,
      response_content_disposition: "attachment",
    )
  end

  private

  def s3
    @s3 ||= Aws::S3::Client.new(
      region: "my-region,
      http_open_timeout: 5,
      http_read_timeout: 25,
    )
  end

  attr_reader :filename
end

Я хочу проверить, возвращает ли #presigned_url экземпляр S3DownloadUrlGenerator URL-адрес.Это мой тест:

describe S3DownloadUrlGenerator do
  before do
    allow(Aws::S3::Client).to receive(:new) { s3_client }
  end
  let(:s3_client) { spy("s3 client") }
  let(:presigner) { spy("s3 presigner") }

  it "generates download URL for a file" do
    expect(Aws::S3::Presigner).to receive(:new).with(client: s3_client).and_return(presigner)
    expect(presigner).to receive(:presigned_url).with(
      :get_object,
      bucket: "my-test-bucket",
      key: "test_file.txt",
      response_content_disposition: "attachment",
    ).and_return("https://www.example.com")
    expect(described_class.new("Test_file.txt").presigned_url).to eq("https://www.example.com")
  end
end

, но я получаю ошибку:

Failure/Error: expect(described_class.new("Test_file.txt").presigned_url).to eq("https://www.example.com")

       expected: "https://www.example.com"
            got: #<Double "s3 presigner">

       (compared using ==)

Я немного новичок в этом, и я хотел бы узнать, как правильно тестировать такие случаи.Большое спасибо за помощь.

1 Ответ

0 голосов
/ 15 мая 2018

параметры ковша и ключа отличаются фактическим вызовом и насмешкой.Используйте приведенный ниже код:

describe S3DownloadUrlGenerator do
  before do
    allow(Aws::S3::Client).to receive(:new) { s3_client }
  end
  let(:s3_client) { spy("s3 client") }
  let(:presigner) { spy("s3 presigner") }
  it "generates download URL for a file" do
    expect(Aws::S3::Presigner).to receive(:new).with(client: s3_client).and_return(presigner)
    expect(presigner).to receive(:presigned_url).with(
      :get_object,
      bucket: "my-bucket",
      key: "Test_file.txt",
      response_content_disposition: "attachment",
    ).and_return("https://www.example.com")
    expect(described_class.new("Test_file.txt").presigned_url).to eq("https://www.example.com")
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...