assert_not_nil foo ==断言定义了吗?在Ruby的Test :: Unit中foo?

时间:2017-09-30 03:09:29

标签: ruby-on-rails ruby unit-testing assertion testunit

我是Ruby / Rails测试的新手。在定义assert_not_nil foo的情况下(即,它不是foo),似乎Test :: Unit方法nil是正确的。正确?

assert_not_nil foo等同于assert defined? foo

如果没有,它们有何不同?如果是这样,有什么理由让我更喜欢其中一个而不是另一个吗?

也许更一般地说,似乎assert可以与其他表达式结合使用,而不是像assert_equalassert_not等更专业的断言方法。但似乎专门的方法是更标准的做法。是对的吗?那是为什么?

1 个答案:

答案 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)本地