RSpe c mocking send_file возвращает шаблон ошибки, отсутствующий - PullRequest
0 голосов
/ 29 января 2020

В одном из моих контроллеров у меня есть следующий метод:

def show
  @icon = @product.icon
  raise ActiveRecord::RecordNotFound unless @icon.present?

  send_file File.join('public', @icon), type: 'image/png', filename: 'icon.png', x_sendfile: true
end

И я пытаюсь проверить метод следующим образом:

it 'it renders the icon' do
  create(:product, icon: 'icon.png')
  icon = double('icon', content_type: 'image/png', filename: 'icon.png')
  allow_any_instance_of(described_class).to receive(:send_file).and_return(icon)
  get(:show, params: { product: 'test' })
  expect(response.header['Content-Type']).to eq('image/png')
  expect(response.header['Content-Disposition']).to eq("attachment; filename=\"icon.png\"")
end

Так что идея состоит в том, чтобы издеваться ответ send_file с double.

Однако я получаю сообщение об ошибке, что шаблон show отсутствует для этого метода ... так что, похоже, он неправильно выдает ответ, который я хочу. ..

Как я могу получить send_file, чтобы вернуть смоделированное изображение в соответствии с моим тестом?

Я также пытался: allow(controller).to receive(:render).and_return(icon) но это просто заканчивается тем, что возвращает пустую строку вместо насмешливого изображения ...

1 Ответ

0 голосов
/ 30 января 2020

Таким образом, решение, которое я придумал, состояло в том, чтобы просто добавить фактическое изображение в spe c, а затем позволить классу File вернуть его, когда мы сделаем соединение с папкой publi c, а затем просто позволить send_file работает как обычно, так как теперь принимает реальное изображение, например:

it 'it renders the icon' do
  create(:product, icon: 'icon.png')
  allow(File).to receive(:join).and_return('./spec/support/images/example.png')
  get(:show, params: { short_code: 'abc123' })
  expect(response.header['Content-Type']).to eq('image/png')
  expect(response.header['Content-Disposition']).to eq('attachment; filename="icon.png"')
end
...