' assert_not user.valid?'与'断言user.invalid?'

时间:2017-03-15 20:38:40

标签: ruby-on-rails railstutorial.org

我正在阅读迈克尔·哈特尔的导轨教程,并且在6.2.2中,UserTest包含了一个名称应该存在的测试'。测试包括代码

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.

是否存在一个测试失败而另一个测试失败的情况,或者这些测试是否可以互换? '断言。无效?'对我来说似乎更自然。

BTW,测试失败,因为测试是在编写验证电子邮件存在的代码之前编写的。

1 个答案:

答案 0 :(得分:0)

是的,它们是等价的。

.valid?并且无效?会给你真或假,而assert_not期望为零或假,断言会期望一个非零对象或真。

假设@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有效,你可以做同样的推理。