我是Ruby / Rails测试的新手。在定义assert_not_nil foo
的情况下(即,它不是foo
),似乎Test :: Unit方法nil
是正确的。正确?
assert_not_nil foo
等同于assert defined? foo
?
如果没有,它们有何不同?如果是这样,有什么理由让我更喜欢其中一个而不是另一个吗?
也许更一般地说,似乎assert
可以与其他表达式结合使用,而不是像assert_equal
和assert_not
等更专业的断言方法。但似乎专门的方法是更标准的做法。是对的吗?那是为什么?
答案 0 :(得分:1)
nil
是一个值,因此定义了一个值为nil的变量。这里有一些repl输出来演示:
[1] pry(main)> a = nil
=> nil
[2] pry(main)> defined? a
=> "local-variable"
[3] pry(main)> defined? b
=> nil
您可能会感到困惑,因为访问未定义的实例变量也会返回nil
,但这仍然不一样:
[4] pry(main)> defined? @b
=> nil
[5] pry(main)> @b = nil
=> nil
[6] pry(main)> defined? @b
=> "instance-variable"
全局变量($foo
)在这方面与实例变量类似,但访问未初始化的类变量(@@bar
)会引发NameError
。
最后一件事:局部变量在Ruby中的解析时声明,因此如果方法的任何分支设置了本地,那么在方法(或块)中的任何位置定义(并初始化为nil
)本地