NoMethodError:运行辅助测试时未定义的方法`scan'

时间:2017-10-28 01:55:22

标签: ruby-on-rails ruby

我有一个帮助器,它截断用户的全名只显示他们的名字。我写了一个小测试,以确保它有效。我强迫自己学会在早期严格测试,所以这可能有点矫枉过正,但我​​正在努力学习更多关于测试应用程序各个方面的知识。

application_helper.rb

 module ApplicationHelper

    def truncate_username(user)
        @first_name = user.scan(/\A[a-zA-Z]+/).first
        return @first_name
    end
end

application_helper_test.rb 要求'test_helper'

class ApplicationHelperTest < ActionView::TestCase

  setup do
    @usr = users(:travis)
  end

  test "First name should be truncated" do
   assert_equal "Travis", truncate_username(@usr)
  end
end

每当我尝试运行此测试时,我都会收到NoMethodError:

ERROR["test_First_name_should_be_truncated", ApplicationHelperTest, 0.7588860000250861]
 test_First_name_should_be_truncated#ApplicationHelperTest (0.76s)
NoMethodError:         NoMethodError: undefined method `scan' for #<User:0x007f9dcec71af0>
            app/helpers/application_helper.rb:4:in `truncate_username'
            test/helpers/application_helper_test.rb:11:in `block in <class:ApplicationHelperTest>'

关于为什么这不起作用的任何想法?或者也许我可以更好地实施这个测试。

1 个答案:

答案 0 :(得分:1)

scan是一种String方法。您传递的方法为User对象,该对象没有scan方法(除非您定义一个)。

为了更清楚,如果您传递一个字符串,您的方法将起作用。在这种情况下,这是用户的全名。

def truncate_username(full_name)
    @first_name = full_name.scan(/\A[a-zA-Z]+/).first
    return @first_name
end

您还可以考虑将此方法直接放在User模型上。如果你定义类似

User.rb

def first_name
   full_name.scan(/\A[a-zA-Z]+/).first
end

(replace full_name with whatever attribute you are storing the user's name to)
然后,您可以在应用中调用@user.first_name而不是truncate_username(@user.full_name)