Метод вспомогательного буфера для спецификации запроса в rails/rspec

У меня есть вспомогательный метод get_books_from_amazon, который выполняет вызов API и возвращает массив книг. Я не могу понять, как его заглушить в моих спецификациях запросов.

module BooksHelper
 def get_books_from_amazon(search_term)
 ...
 end
end
class StaticController < ApplicationController
 include BooksHelper
 def resources
 @books = get_books_from_amazon(search_term)
 end
end

Я пробовал следующее в моей спецификации, каждый безрезультатно:

# spec/requests/resource_pages_spec.rb
...
describe "Navigation" do
 it "should do such and such" do
 BooksHelper.stub!(:get_books_from_amazon).and_return(book_array)
 StaticHelper.stub!(:get_books_from_amazon).and_return(book_array)
 ApplicationHelper.stub!(:get_books_from_amazon).and_return(book_array)
 StaticController.stub!(:get_books_from_amazon).and_return(book_array[0..4])
 ApplicationController.stub!(:get_books_from_amazon).and_return(book_array[0..4])
 request.stub!(:get_books_from_amazon).and_return(book_array)
 helper.stub!(:get_books_from_amazon).and_return(book_array)
 controller.stub!(:get_books_from_amazon).and_return(book_array)
 self.stub!(:get_books_from_amazon).and_return(book_array)
 stub!(:get_books_from_amazon).and_return(book_array)
 visit resources_path
 save_and_open_page
 end

Любые идеи о том, что проблема?

2 ответа

Помощники обычно используются для очистки "логики" презентации, поэтому я не ставил бы что-то вроде вызова API Amazon в вспомогательном методе.

Вместо этого переместите этот метод на простой старый класс Ruby, который вы можете вызвать с вашего контроллера. Примером может быть:

class AmazonBookRetriever
 def get_books_from_amazon
 #code here
 end
end

Затем ваш контроллер может вызвать его:

def resources
 @books = AmazonBookRetriever.new.get_books_from_amazon(params[:search_term])
end

Это должно сделать насмешку намного легче. Вы можете заглушить #new в AmazonBookRetriever, чтобы вернуть макет, и убедитесь, что он получает сообщение get_books_from_amazon.


Ответ Kendick - хороший совет в этой ситуации.

Я добавил это, если кто-то действительно ищет ответ на исходный вопрос:

ActionView::Base.any_instance.stub(:helper_method) { "substitute return value" }

licensed under cc by-sa 3.0 with attribution.