ruby-on-rails – Rails:Test :: Unit为什么在任何其他断言之前
这似乎有点奇怪,当运行单元测试来检查我的标题的长度是否> 10如果我包含“断言product.invalid?”,我的测试将通过.在我的其他任何断言之前:
require 'test_helper' class ProductTest < ActiveSupport::TestCase test "product title is too short" do product = Product.new(:title => "My lady",:description => "yyy",:price => 1 ) assert product.invalid? assert_equal "must be atleast 10 characters long.",product.errors[:title].join('; ') end end 但是,如果我不包括“断言product.invalid?”在assert_equal之前我得到了这个错误 这就是Test :: Unit的工作原理吗?在进行其他测试之前,我必须断言某些内容有效或无效?有点像初始化测试? 解决方法
这实际上不是您的测试框架的特征,而是ActiveRecord的特征.
使用ActiveRecord创建对象时,您可以分配验证以确保有关对象属性的某些事项(就像您在对象上一样).但是,这些验证只能在特定时间运行,而且正如您所观察到的那样,“新”方法不是这些时间之一.但是,通过询问具有无效的对象的有效性?方法,你已经触发了验证. 我认为更自然的是使用“创建”方法而不是“新”来触发对象的验证.自动创建支票验证,这将消除您对“无效”的调用?在您的测试中,仍应根据需要填充错误哈希值: product = Product.create(:title => "My lady",:price => 1 ) assert_equal "must be atleast 10 characters long.",product.errors[:title].join('; ') 与“创造”方法类似的是“创造”!如果任何验证失败,将实际引发异常的方法. create将只返回false并填充错误哈希. 有关验证的更多信息,请查看: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |