如何测试Rails:生活在application.rb中的helper_methods?

时间:2010-01-18 14:02:33

标签: ruby-on-rails unit-testing

这是我的情况 - 我有一个名为LayoutHelper的帮助器,用于帮助我构建布局,我正在尝试测试以下方法。

它在LayoutHelper中有一个类似于这个的方法:

def show_login_form?
  return false if @hide_login_form || logged_in?
  return true
end

我的application.rb中也有以下内容:

helper_method :logged_in?

def logged_in?
  return @logged_in_user.present?
end

最后,我的测试文件如下所示:

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

class LayoutHelperTest < ActionView::TestCase                                  

  def test_hide_login_form                                                     
    assert(show_login_form?)                                                   
    hide_login_form                                                            
    assert(!show_login_form?)                                                  
  end                                                                          

end

我现在的问题是,当我运行此测试时,我得到了这个:

NoMethodError: undefined method `logged_in?' for #<LayoutHelperTest:0xb7a7aca8>
app/helpers/layout_helper.rb:17:in `show_login_form?'
layout_helper_test.rb:12:in `test_hide_login_form'

我想知道我是否正在以正确的Rails方式执行此操作,如果是这样,我需要更改以便让此测试工作。

1 个答案:

答案 0 :(得分:0)

我不得不说,起初这让我很难过 - 但我终于找到了不太正确的事情。

助手是html生成器,应该构建在一个泡沫中 - 不知道会话,控制器等发生了什么。你的show_login_form?方法不生成代码,它使用控制器方法。它应该在application_controller.rb本身,并在控制器测试中进行测试。

一旦你搬到这里,你应该没有问题测试。哦,这可能是编写方法本身的一种更简单,更甜蜜的方式:

def show_login_form?
  !(@hide_login_form || logged_in?)
end

我希望这会有所帮助。它当然让我研究辅助测试,直到现在我都忽略了它。