1

lib ディレクトリにモジュールを作成し、そこに含まれるさまざまなメソッドを Rails アプリ全体で (インクルード ModuleName を追加した後) 問題なく自由に呼び出すことができます。

ただし、テストに関しては、そのような方法が存在しないと不平を言っています。モジュールをテストヘルパーに含めようとしましたが、うまくいきませんでした。誰でも助けることができます。

4) Error:
test_valid_signup_redirects_user_to_spreedly(UsersControllerTest):
NoMethodError: undefined method `spreedly_signup_url' for SpreedlyTools:Module
    /test/functional/user_controller_test.rb:119:in `test_valid_signup_redirects_user_to_spreedly'

module SpreedlyTools
  protected
  def spreedly_signup_url(user)
    return "blahblah"
  end
end

class ApplicationController < ActionController::Base


  helper :all # include all helpers, all the time
  protect_from_forgery # See ActionController::RequestForgeryProtection for details
  include SpreedlyTools
  ....
end

ENV["RAILS_ENV"] = "test"
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'test_help'

class ActiveSupport::TestCase
   include SpreedlyTools
   ....
end

require File.dirname(__FILE__) + '/../test_helper'
require 'users_controller'

# Re-raise errors caught by the controller.
class UsersController; def rescue_action(e) raise e end; end

class UsersControllerTest < ActionController::TestCase
....

  def test_valid_signup_redirects_user_to_spreedly
    get :new
    assert_response :success
    post :create, :user =>  {:first_name => "bobby",
                      :last_name => "brown",
                      :email => "bobby.brown@gmail.com",
                      :email_confirmation => "bobby.brown@gmail.com",
                      :password => "bobby1",
                      :password_confirmation => "bobby1"}

    assert_response :redirect
    user = assigns(:user)
    assert_redirected_to SpreedlyTools.spreedly_signup_url(user)

  end
end
4

2 に答える 2

4

ここにはいくつかの異なるエラーがあります。まず、モジュールを作成し、モジュールのコンテンツをクラスに混在させると、モジュール内のメソッドがクラス自体の一部になります。

とはいえ、次の行は意味をなさない

assert_redirected_to SpreedlyTools.spreedly_signup_url(user)

モジュールを User クラスに混在させたと仮定すると、メソッドを次のように呼び出す必要があります。

assert_redirected_to User.new.spreedly_signup_url(user)

new発言にも注意。includeモジュールをクラスに入れ、クラスには入れないためextend、メソッドはクラス メソッドではなくインスタンス メソッドになります。

assert_redirected_to User.new.spreedly_signup_url(user) # valid
assert_redirected_to User.spreedly_signup_url(user) # invalid

このため、次の行は意味がありません。

class ActiveSupport::TestCase
   include SpreedlyTools
   ....
end
于 2009-12-01T14:04:59.687 に答える
1

ああ、それは微妙な問題ですが、簡単に修正できます。テストスイートにSpreedlyToolsを含めるのではなく、SpreedlyToolsを含むクラスによって作成されたオブジェクトをテストする必要があります。

Rubyでは、モジュールが機能すると考えている方法でクラスがより多く機能することがわかります。クラスレベルの関数は、次のように定義することで使用できます。

class SpreedlyTools
  def self.spreedly_signup_url user
    ...
  end
end

SpreedlyTools.spreedly_signup_url user

これは今では理にかなっています。

モジュールは、コードを他のクラスにミックスするためのものです。しかし、汎用ツールを常に利用できるようにしたい場合は、クラスレベルの関数が本当に必要です。

于 2009-12-01T17:03:00.890 に答える