我正在关注Rails教程,我们创建了一个用户模型,然后使用RSpec进行测试。在spec / model / user_spec.rb中 我们有:
require 'spec_helper'
describe User do
before do
@user = User.new(name: "Example User", email: "user@example.com")
end
subject { @user }
it { should respond_to(:name) }
it { should respond_to(:email) }
it { should be_valid }
describe "when name is not present" do
before { @user.name = " " }
it { should_not be_valid }
end
end
运行测试时失败。当我们在用户模型中添加以下内容时:
validates :name, presence: true
它过去了。我明白那个。我不明白的是使用这个:
describe "when name is not present" do
before { @user.name = " " }
it { should_not be_valid }
end
验证存在不足够吗?
答案 0 :(得分:1)
在您编辑之后,我想您会问,“如果我们已经检查过name
是否存在以验证模型类中的记录,为什么我们在测试中再次检查它?”简单但不是很清楚的答案是第一部分是检查用户是否有名称,第二部分是测试您的应用程序在实际向新用户提供时执行此检查。
validates :name
行正在检查是否存在name属性的值;如果没有,当在该模型类的实例上调用save
方法时,Rails将不会保存记录,并且它将生成错误消息。
规范正在测试验证如果您尝试为必须验证的属性(name
)分配空白或零值,那么Rails将不会认为它有效,从而阻止它被保存并且触发错误消息。
有一种观点认为这是一种过度杀伤作为一种考验;从某种意义上说,你只是在测试Rails中内置的功能(validates
方法),它可能已在那里测试过,正如预期的那样工作。
另一方面,如果您首先编写测试并使用它们来描述用户模型的预期行为,那么您可以争辩说您正在测试与尝试创建无效用户以确认相关联的应用程序行为它按预期工作。我普遍同意后一种观点。
答案 1 :(得分:0)
以下行为User
模型添加了一些验证:
validates :name, presence: true
这告诉Rails,name
模型的实例必须存在User
属性才有效。如果模型的实例无效,则无法保存...通过此方法,您可以防止保存无效记录。
在学习本教程的过程中,当您在表单中看到验证错误时,这将开始变得更有意义。