1

Rails 2.2.2 を使用していますが、どのように params 値を設定してヘルパー メソッドをテストできるのか疑問に思っています。

ヘルパー メソッドを使用してテストを実行できる例をいくつか見つけましたが、メソッドで request または params の値を直接使用するとうまくいきません。

require 'test_helper'

class ProductHelperTest < Test::Unit::TestCase
  include ProductHelper

  context 'ProductHelper' do
    should 'build the link' do
      assert_equal '', build_link
    end
  end
end

request または params 値を使用すると、ローカル変数またはメソッドが未定義であるというエラーが表示されます。値を設定するにはどうすればよいですか?

request 値を使用すると shoulda からエラーが発生し、params 値を使用すると同じメッセージになります。

1) Error:
test: ProductHelper should build the link. (ProductHelperTest):
NameError: undefined local variable or method `request` for #<ProductHelperTest:0x33ace6c>
  /vendor/rails/actionpack/lib/action_controller/test_process.rb:471:in `method_missing`
  /app/helpers/products_helper.rb:14:in `build_link`
  ./test/unit/product_helper_test.rb:10:in `__bind_1251902384_440357`
  /vendor/gems/thoughtbot-shoulda-2.0.5/lib/shoulda/context.rb:254:in `call`
  /vendor/gems/thoughtbot-shoulda-2.0.5/lib/shoulda/context.rb:254:in `test: ProductHelper should build the link. `
  /vendor/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:94:in `__send__`
  /vendor/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:94:in `run`
4

3 に答える 3

3

テストでモックオブジェクトを定義してrequest、呼び出しをモックアウトする必要があると思います。paramsmocha

# Assuming ProductHelper implementation
module ProductHelper
  def build_link
    "#{request.path}?#{params[:id]}"
  end
end

class ProductHelperTest < Test::Unit::TestCase
  include ProductHelper

  # mock by defining a method
  def params
    { :controller => "test", :id => "23" }
  end

  # mock request.path using `mocha` # => "my_url"
  def request
    mock(:path => "my_url")
  end

  context 'ProductHelper' do
    should 'build the link' do
      assert_equal 'my_url?23', build_link
    end
  end
end

これがお役に立てば幸いです:)

于 2009-09-07T12:40:10.837 に答える
0

注として、Rails 2.3.x または ActionView::TestCase を使用するものを使用している場合は、テストでプライベート params メソッドを定義するだけで十分です。

例えば

require 'test_helper'

class BookmarksHelperTest < ActionView::TestCase

  context "with an applied filter of my bookmarks" do
    setup do
      expects(:applied_filters).returns({:my_bookmarks => true})
    end

    should "not be able to see it when other filters are called using my_bookmarks_filter" do
      assert_equal other_filters(:my_bookmarks), {}
    end
  end

  private

    def params
      {}
    end

end

ActionView::TestCase 内のメソッドとして params を定義することで、さらに良いことができます。

于 2010-10-19T22:15:41.233 に答える