我在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
endclass ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
protect_from_forgery # See ActionController::RequestForgeryProtection for details
include SpreedlyTools
....
endENV["RAILS_ENV"] = "test"
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'test_help'
class ActiveSupport::TestCase
include SpreedlyTools
....
endrequire 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发布于 2009-12-01 14:04:59
这里有几个不同的错误。首先,当您创建一个模块并将模块的内容混合到一个类中时,模块中的方法就会成为类本身的一部分。
也就是说,下面这句话是没有道理的
assert_redirected_to SpreedlyTools.spreedly_signup_url(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-01 17:03:00
啊,这是个微妙的问题,但很容易纠正。与其在测试套件中包括SpreedlyTools,不如测试由包含SpreedlyTools的类创建的对象。
在Ruby中,您可能会发现类的工作方式更符合您的思维方式。您可以通过这样定义类级函数来使用它:
class SpreedlyTools
def self.spreedly_signup_url user
...
end
end
SpreedlyTools.spreedly_signup_url user这现在就说得通了。
模块用于将代码混合到其他类中。但是,如果您只希望在任何时候都可以使用通用工具,那么您确实需要类级函数。
https://stackoverflow.com/questions/1826282
复制相似问题