4

API 呼び出しを行い、書籍の配列を返す get_books_from_amazon というヘルパー メソッドがあります。リクエスト仕様でそれをスタブ化する方法がわかりません。

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

問題が何であるかについてのアイデアはありますか?

4

2 に答える 2

8

Kendick の回答は、この状況での適切なアドバイスです。

誰かが実際に元の質問への回答を探している場合に備えて、これを追加しました。

ActionView::Base.any_instance.stub(:helper_method) { "substitute return value" } 
于 2013-04-25T16:52:13.597 に答える
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

これにより、モックがはるかに簡単になります。にスタブ#newしてAmazonBookRetrieverモックを返し、それがメッセージを受信することを確認できget_books_from_amazonます。

于 2012-10-23T20:30:04.393 に答える