我有一个帮助器,它截断用户的全名只显示他们的名字。我写了一个小测试,以确保它有效。我强迫自己学会在早期严格测试,所以这可能有点矫枉过正,但我正在努力学习更多关于测试应用程序各个方面的知识。
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>'
关于为什么这不起作用的任何想法?或者也许我可以更好地实施这个测试。
答案 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)
。