所以......这是我的单元测试文件的顶部。
class ObjectTest < ActiveSupport::TestCase
@user = -1
失败的测试(也是第一个使用@user的测试)
test "for detection of first content" do
puts "+++++++++++++++++++++++++++++ #{@user.name}"
这是我得到的错误
NoMethodError: undefined method `name' for nil:NilClass
现在,我知道一个数字不能有.name等任何属性,但我正在尝试解决与尝试获取整数名称无关的问题。问题是我的测试文件中任何地方定义的实例变量在测试开始时立即变为零 - 尽可能地,测试的实际内容无关紧要,@ user内部的数据正在以某种方式消失。 = \
答案 0 :(得分:2)
类实例变量有点奇怪,我没有那么多地使用它们,但如果我正确地理解它们,它们就存在于类本身上,并且只能在类方法中使用@符号进行访问 - 所以你会当你在实例方法中时,必须以@user
或ObjectTest.user
访问self.class.user
,否则Ruby将在实例方法中查找实例实例变量。换句话说,在类函数中,您可以引用@user
,但在实例函数中,Ruby正在实例上查找@user变量。 here是一个似乎可以证明此行为的页面。
由于类变量(例如@@user
)使用完全不同的语法,因此它们不应显示此范围冲突行为 - 您可以在类和实例方法中使用@@user
。