我一直在railstutorial.org处理这些教程,我对作者的代码 - 6.2.1验证状态感到有些困惑。
在用户模型中,教程添加了validates :name, :presence => true
。很简单。
当作者选择编写rspec测试时,他会做一些我认为有点奇怪的事情。
describe User do
before(:each) do
@attr = { :name => "Example User", :email => "user@example.com" }
end
.
.
.
it "should require a name" do
no_name_user = User.new(@attr.merge(:name => ""))
no_name_user.should_not be_valid
end
end
当人们可以摆脱:每个块语句并简单地写一下时,为什么要麻烦地将空字符串合并到@attr
:
it "should require a name" do
no_name_user = User.new(:name => "", :email => "user@example.com")
no_name_user.should_not be_valid
end
我知道作者使用@attr
变量来验证电子邮件地址的存在,这是他使用块语句的原因之一 - 对我而言,遵循第二块报价的结构。不过,我有一种感觉,我在这里缺少一些东西。
我想到的另一个解释是,当有很多键要输入时,使用@attr
结构是有帮助的,而不是只有名称和电子邮件这种相当简单的情况。
有人有任何意见吗?
答案 0 :(得分:1)
所以有一个标准的属性映射可以在所有测试中使用。当测试要求不是时,它就会被删除。
就我个人而言,我并不相信它是值得的,因为它会混淆一些东西(正如你所发现的那样),但它确实存在。
答案 1 :(得分:1)
关键是只有代码与测试中的测试用例相关。测试用户在没有名称时无效的唯一相关属性是name属性。该测试不应该对电子邮件属性有任何了解。
假设您为新字段的存在添加了验证 - 您必须更新在没有该字段的情况下构建用户的每个测试。使用顶部的attr
哈希,您只需在其中弹出新字段,所有测试都可以。
创建测试对象是一个很常见的问题,有很多解决方案,并且讨论哪种方式最好。我建议你看看工厂。 Machinist和FactoryGirl是两种适用于Rails的替代方案。