[英]Michael Hartl Rails tutorial: assert_not does exact opposite of what it should and I don't understand why
[英]Why don't I understand the Rails validates presence from tutorial?
我正在关注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
验证存在还不够吗?
编辑完之后,我想您是在问:“如果我们已经检查过存在的name
以验证模型类中的记录,为什么还要在测试中再次检查它呢?” 一个简单但不是很明确的答案是,第一部分是检查用户是否具有名称,第二部分是测试您的应用程序在实际呈现给新用户时是否执行此检查。
validates :name
行将检查name属性值是否存在; 如果不是,则在该模型类的实例上调用save
方法时,Rails不会保存该记录,并且它将生成一条错误消息。
规范正在测试以验证是否尝试为必须验证的属性( name
)分配空白或nil值,Rails不会将其视为有效,从而防止其被保存并触发错误消息。
有一种观点认为,作为一种考验,这是过分杀伤力的。 从某种意义上说,您只是在测试Rails内建的功能( validates
方法)(预期已经在此处进行了测试)是否按预期工作。
另一方面,如果您首先编写测试并使用它们来描述User模型的预期行为,则可以认为您正在测试与试图创建无效User来确认其正常工作相关的应用程序行为。意。 我大体上同意后一种观点。
以下行为User
模型添加了一些验证:
validates :name, presence: true
这告诉Rails必须存在name
属性,以使User
模型的实例有效。 如果模型的实例无效,则无法保存...,通过这种方法可以防止保存无效记录。
随着教程的逐步进行,当您在表格中看到验证错误时,这将变得更加有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.