使用 RSpec 和 Rails 测试模型验证有三种常见方法:
expect(post.errors[:title]).to include("can't be blank")
expect(post.errors[:title].size).to eq(1)
expect(post).not_to be_valid
IMO,第三个选项不好,因为记录可能由于一个或多个属性中的无效值而无效,甚至可能不包括我们打算测试的属性。
那么,您认为哪种方法最好,第一种还是第二种?。
需要考虑的几个因素:
鉴于内置验证的默认错误消息是由 Rails 框架的开发人员设置的(我们不拥有该代码),它们可能在任何给定时间发生变化,如果我们的验证测试期望特定的错误消息,它们将打破。
关于自定义错误消息(对于内置验证和自定义验证器),尽管它们在我们的控制之下,但更改这些消息会破坏我们的测试这一事实让人怀疑测试是否不太脆弱。
post.errors[:title].size
将是2
,所以第一个和第二个选项都涵盖了这个。rspec-rails
开发者在这里讨论这个主题。提前致谢。
第一个和第二个选项似乎都足够好。您提到了有关验证消息和我们不拥有的代码的有效观点。考虑到这一点,您始终可以使用正则表达式测试消息:
expect(post.errors[:title]).to match(/blank/)
我认为错误消息不会有其他变化。