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

ruby-on-rails – Rails:Test :: Unit为什么在任何其他断言之前

发布时间:2020-12-17 03:00:23 所属栏目:百科 来源:网络整理
导读:这似乎有点奇怪,当运行单元测试来检查我的标题的长度是否 10如果我包含“断言product.invalid?”,我的测试将通过.在我的其他任何断言之前: require 'test_helper'class ProductTest ActiveSupport::TestCasetest "product title is too short" do product
这似乎有点奇怪,当运行单元测试来检查我的标题的长度是否> 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之前我得到了这个错误
1)失败:test_product_title_is_too_short blah blah blah
(“必须至少10个字符.”)预期但是(“”).

这就是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并填充错误哈希.

有关验证的更多信息,请查看:
http://guides.rubyonrails.org/active_record_validations_callbacks.html

(编辑:李大同)

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

    推荐文章
      热点阅读