在模型规范中测试验证时我们是否应该断言特定错误?

问题描述 投票:0回答:1

使用 RSpec 和 Rails 测试模型验证有三种常见方法:

  1. expect(post.errors[:title]).to include("can't be blank")
  2. expect(post.errors[:title].size).to eq(1)
  3. expect(post).not_to be_valid

IMO,第三个选项不好,因为记录可能由于一个或多个属性中的无效值而无效,甚至可能不包括我们打算测试的属性。

那么,您认为哪种方法最好,第一种还是第二种?

需要考虑的几个因素:

只测试你拥有的东西

鉴于内置验证的默认错误消息是由 Rails 框架的开发人员设置的(我们不拥有该代码),它们可能在任何给定时间发生变化,如果我们的验证测试期望特定的错误消息,它们将打破。

关于自定义错误消息(对于内置验证和自定义验证器),尽管它们在我们的控制之下,但更改这些消息会破坏我们的测试这一事实让人怀疑测试是否不太脆弱。

确保其他验证错误不会影响测试结果

  • 如果我们正在测试的验证和另一个验证都失败,
    post.errors[:title].size
    将是
    2
    ,所以第一个和第二个选项都涵盖了这个。
  • 如果我们期望失败的验证通过,而我们期望通过的另一个验证失败(两者都与被测试的属性有关),那么我们的测试将在不应该通过的时候通过。这可能是支持在测试验证时断言特定错误消息的论点。 您能想出一种方法来解决这个问题而不断言特定的错误消息吗?

相关意见:

  • rspec-rails
    开发者在这里讨论这个主题。
  • 本书中包含的验证测试Aaron Sumner 的《Everyday Rails Testing with RSpec》 确实需要特定的错误消息。

提前致谢。

ruby-on-rails ruby validation testing rspec
1个回答
0
投票

第一个和第二个选项似乎都足够好。您提到了有关验证消息和我们不拥有的代码的有效观点。考虑到这一点,您始终可以使用正则表达式测试消息:

expect(post.errors[:title]).to match(/blank/)

我认为错误消息不会有其他变化。

© www.soinside.com 2019 - 2024. All rights reserved.