'assert_not user.valid?' 对比 'assert user.invalid?'

'assert_not user.valid?' vs. 'assert user.invalid?'

我正在阅读 Michael Hartl 的 rails 教程,并且在 6.2.2 UserTest 中包含针对 'name should be present' 的测试。测试包括代码

test 'email should be present' do
  @user.email = "   "    
  assert_not user.valid?
end

当测试失败时,输出如下:

FAIL["test_name_should_be_present", UserTest, 0.10366088798036799]
 test_name_should_be_present#UserTest (0.10s)
        Expected true to be nil or false

如果我将断言更改为

test 'email should be present' do
  @user.email = "   "
  assert user.invalid?
end

失败的测试输出是

 FAIL["test_name_should_be_present", UserTest, 0.11991263600066304]
 test_name_should_be_present#UserTest (0.12s)
        Expected false to be truthy.

是否存在一种测试会失败而另一种测试不会失败的情况,或者这些情况可以互换? 'assert .invalid?' 对我来说更自然。

顺便说一句,测试失败了,因为测试是在编写验证电子邮件是否存在的代码之前编写的。

是的,它们是等价的。

.valid? and invalid? will give you true or false, while assert_not 期望 nil 或 false,assert 期望非 nil 对象或 true。

假设@user无效,那么你可以:

assert_not @user.valid? 
#valid will give you false, so 'assert_not false' is true, and the test passes.

另一方面:

assert @user.invalid? 
#invalid will give you true, so 'assert true' is true, and the test passes.

如果我们改变假设并且@user 是有效的,你可以做同样的推理。