4

url_forGem のヘルパー内で Gadget インスタンス (ダミー アプリのスタブ モデル)を呼び出すと、

undefined method `gadgets_path' for #<#<Class:0x007fe274bc1228>:0x007fe273d45eb0>

背景: gem をフォークして、いくつかの重要な変更を加えました。(これが forkです。) 今、rspec テストを機能させようとしているので、今後の更新を検証できます。

テストは、Rails エンジンのようにセットアップされ、specディレクトリ内にダミーのアプリがあります。そのアプリには、適切なコントローラーとファイルGadgetで宣言されたリソースを含む 1 つのモデル ( ) があります。spec/dummy/environment/routes.rb

Dummy::Application.routes.draw do
  resources :gadgets
end

ファイルは次のspec/spec_helper.rbようになります。

ENV["RAILS_ENV"] ||= "test"

require File.expand_path("../dummy/config/environment", __FILE__)
require 'rspec/rails'

require 'rspec/autorun'

RSpec.configure do |config|
  config.mock_framework = :rspec
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.order = "random"

  config.include Rails.application.routes.url_helpers
end

(実際には、プロジェクトの github リポジトリで完全なテスト セットアップを確認できます。私は実際に 1 週​​間ほど前にこのイシューを開いたのですが、今になってようやく解決しようとしています。)

保留されていない 1 つのテストは Gadget インスタンスを作成し、それを引数としてヘルパーを呼び出します。ヘルパーが を試行するとurl_for(@gadget)、上記のエラーが発生します。

ここで何が問題なのですか?

ETA 12 月 04: 現在の で更新spec_helper.rb

4

2 に答える 2

11

アップデート

これをあなたのspec_helper.rbの中に入れてください-少なくともこれは私にとってはうまくいきます(私はあなたのレポを複製しました)

ActionView::TestCase::TestController.instance_eval do
  helper Rails.application.routes.url_helpers#, (append other helpers you need)
end
ActionView::TestCase::TestController.class_eval do
  def _routes
    Rails.application.routes
  end
end

本当の問題は、ルート ヘルパー メソッドで拡張されるTestControllerにサブクラス化されたことです。 したがって、それを に戻す必要があります。さらに、AbstractController::UrlForを実装する必要があります。ActionController::Base ActionController::Base
TestController_routes


ルーティングヘルパーを使用するには、挿入する必要があります

Rspec.configure do |config|
  config.include Rails.application.routes.url_helpers
  ...
end

something_pathすべてのメソッドを利用可能にする spec_helper.rb で。実際の問題を回避する別の方法は、次のようにヘルパーをスタブ化することです。

helper.stub!(:url_for).and_return("/path")
于 2012-12-04T13:39:46.610 に答える
1

これはかなりの量のソース コードですが、あなたが呼び出しているのはeditable_fieldwhich を呼び出しているように思えますurl_for。ただしurl_for、コントローラーのコンテキストでのみ機能しますが、仕様の途中で呼び出すだけです。

したがって、おそらくこのメソッドをスタブ化するか、統合テストを実行することが適切な回避策になるでしょう。

于 2012-12-04T12:01:03.490 に答える