2012-10-23 93 views
4

我有一个称为get_books_from_amazon的帮助器方法,它执行API调用并返回书籍数组。我无法弄清楚如何在我的请求规格中进行存根。rails/rspec中请求规范的存根帮助器方法

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 

任何想法的问题是什么?

回答

5

助手通常用于清理演示文稿“逻辑”,所以我不会在助手方法中使用类似于调用Amazon API的东西。

相反,将该方法移动到一个普通的旧的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 

这应该使嘲讽轻松了许多。您可以在AmazonBookRetriever上存根#new以返回模拟,并验证它是否收到get_books_from_amazon消息。

+0

谢谢你的建议。我曾考虑将它制作为Books模型,但这听起来更准确一些。你通常在文件树中放置这样的东西?仍然在应用/模型? – tyler

+1

是的,你可以 - 许多人会说 - 应用/模型中放置非ActiveRecord模型。 –

7

肯迪克的回应是在这种情况下的好建议。

我已经添加了这种的情况下,任何人实际上是寻找一个答案,原来的问题:

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

对于未来的搜索者,请查看'expect_any_instance_of'和'allow_any_instance_of'以及rspec 3.0 [any_instance](https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/any-instance #掘根的任何实例对的一类,与特定的论点) – grossadamm