Как мне заглушить send_file, используя mocha - PullRequest
3 голосов
/ 17 августа 2011

Самая прямая попытка состоит в том, чтобы сделать

@controller.stubs(:send_file)

Но это приводит к ошибке вывода, такой как

ActionView::MissingTemplate: Missing template ...

Итак, как мне заглушить метод send_fileиз серии 2.3.x .

По сути, это тот же вопрос, который был задан на ruby-forum февраль 2009 , на который так и не был получен ответ.

Ярл

Ответы [ 3 ]

2 голосов
/ 30 ноября 2015

С Rails 4 (а может и раньше) [1], ImplicitRender обрабатывает это и проверяет "выполнено?".

Итак, если вы хотите заглушить это, заглушить "выполнено?" должно хватить:

subject.stubs(:performed?).returns(true)
subject.expects(:send_file).
  with(image, disposition: "inline")

Реализация performed тоже не сложная:

performed?
  response_body || (response && response.committed?)
end

Так, в случаях, когда вы не хотите или не можете заглушить performed, просто убедитесь, что response_body не ноль.


[1] С 5+ это было перемещено в BasicImplicitRender.

0 голосов
/ 06 ноября 2012

Мне тоже пришлось с этим бороться.Насколько я могу судить, лучшее решение для меня было:

(контроллер)

def some_action
  send_file(some_action_filename)
end

private

def some_action_filename
  "/public/something.tgz"
end

(тест)

test "some_action" do
  filename = Rails.root.join("tmp/testfile.tgz")
  assert FileUtils.touch filename  
  @controller.expects(:some_action_filename).at_least_once().returns(filename)
  post :some_action
end

Я нефанат изменения вашего кода, чтобы вы могли тестировать, но я меньше поклонник тратить часы и часы, чтобы найти правильное решение для довольно тривиальной проблемы:)

0 голосов
/ 22 августа 2011

Отсутствующие ошибки шаблона, вероятно, указывают на тот факт, что send_file теперь ничего не делает (из-за заглушки), поэтому Rails попытается пройтись по цепочке рендеринга и попытаться отобразить шаблон.

Выфактически отключил вызов send_file, поэтому вам нужно будет изменить заглушку, чтобы она действительно отправляла что-то, что Rails может интерпретировать и думать, что запрос обработан, потому что файл обслуживается, и в этом случае больше не нужно будет отображать шаблон.

...