ruby-on-rails – Michael Hartl Rails教程:assert_not确实与它
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(即使使用真/有效的用户名),因此不会将此有效名称写入数据库. 如果有人能够解释这是否有任何意义,我会非常感激,并且通过它的详细解答会更好. 解决方法
如果后面的表达式@ user.valid?返回false,则assert_not返回true(与测试传递相同).实际上,第3节中的测试说:我们并未断言用户是有效的.由于该期望/断言是正确的,它返回true并且测试通过.没有任何内容保存到数据库中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |