加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Michael Hartl Rails教程:assert_not确实与它

发布时间:2020-12-17 02:24:46 所属栏目:百科 来源:网络整理
导读:tl; dr有效名称不会写入数据库,因为测试失败,并且因为测试通过而无效的名称会写入数据库. 编辑:有关项目和我的问题的一般说明:如本书所述,此用户模型设置为允许网站用户最终登录网站的开始阶段.数据库列将是“name”和“email”,每行将是一个用户(假设用户
tl; dr有效名称不会写入数据库,因为测试失败,并且因为测试通过而无效的名称会写入数据库.

编辑:有关项目和我的问题的一般说明:如本书所述,此用户模型设置为允许网站用户最终登录网站的开始阶段.数据库列将是“name”和“email”,每行将是一个用户(假设用户名和电子邮件有效).我已经编辑了下面的原始帖子以进一步说明,所有编辑都用斜体字表示.

此外,如果您可以在我的帖子中解释代码,请回复 – 请不要建议添加其他代码以使其正常工作.我正在使用的教科书声称这段代码应该按原样运行,但它似乎正好相反.最后,如果您知道其他链接可以更详细地解释这一点,那么这很有帮助;但是,我已经阅读了apidock,RoR API以及大多数在Google搜索中显示的SO链接,但没有一个能够帮助解释这个问题.

我正在研究Michael Hartl的Ruby on Rails教程.我正在进行第6章的验证测试,并且我坚持对名称的存在进行验证.它似乎与教程应该做的完全相反(即,验证无效的名称条目),即使我完全按照教程.我还搜索了网络和SO,了解有关assert_not如何工作的更多细节,但找不到任何有用的细节.这是我经历过的过程.

>添加我们知道将失败的测试:

require 'test_helper'

class UserTest < ActiveSupport::TestCase

  def setup
    @user = User.new(name: "Example User",email: "user@example.com")
  end

  # resolves to true and passes
  test "should be valid" do
   assert @user.valid?
  end

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

end

到现在为止还挺好.我完全理解这段代码,虽然第二个测试的措辞很尴尬,但我解释了assert_not @ user.valid?像这样工作:@ user.valid?计算结果为true,因为没有设置任何验证,因此测试认为所有空格的名称都是有效的.这之前是assert_not,它将true值转换为false,并使测试失败.

>我们添加验证测试:

class User < ActiveRecord::Base
  validates :name,presence: true
end

这将为User模型设置验证规则,以确保:name对象具有内容且不是nil,空字符串或空格.到目前为止仍然很好.

>这里的事情变得棘手.此时,表达式@ user.valid?在我们的测试中,应该(并且确实)评估为false,因为验证规则将不允许:名称中只包含空格.我在此代码旁边添加了注释,以帮助我了解在此过程中分配和评估的值:

test "name should be present" do
    @user.name = "   "
    # => name: "   " email: "example@example.com"
    assert_not @user.valid? 
    # => assert_not false => true
end

@ user.valid?求值为false,这使整个assert_not表达式求值为true,从而测试通过.在伪代码中,这一行可以这样翻译:assert_not(用户是否有效?否)==> assert_not(false)==>真正.类似地,“我们不断言用户是假的”,其评估为真.

这就是我的问题所在:测试传递了一个无效的值:name,因此允许将包含空格的名称写入数据库,这与我们试图实现的完全相反,即防止空白写入db的名称.

>相反,我使用有效名称计算出这个逻辑:

test "name should be present" do
# => name: "Example User" email: "example@example.com"
    assert_not @user.valid? 
    # assert_not true => false
end

在这种情况下,因为@ user.valid?求值为true(因为“示例用户”是有效名称),assert_not @ user.valid?计算结果为false,测试失败,并且我们的有效名称不会写入数据库.在伪代码中,这一行可以这样翻译:assert_not(用户是否有效?是)==> assert_not(true)==>假.类似地,“我们不断言用户是真的”,其评估为false.由于测试的计算结果为false(即使使用真/有效的用户名),因此不会将此有效名称写入数据库.

如果有人能够解释这是否有任何意义,我会非常感激,并且通过它的详细解答会更好.

解决方法

The test passes on an invalid value for
:name,thus allowing a name consisting of blank spaces to be written
to the database…

如果后面的表达式@ user.valid?返回false,则assert_not返回true(与测试传递相同).实际上,第3节中的测试说:我们并未断言用户是有效的.由于该期望/断言是正确的,它返回true并且测试通过.没有任何内容保存到数据库中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读