我一直在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
当我们可以摆脱:each块语句并简单地写:
时,为什么要麻烦地将空白字符串合并到@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
结构是有帮助的,而不是这个相当简单的只有名字和电子邮件的情况。
有人有什么意见吗?
这样就有一个可以在所有测试中使用的标准属性映射。当测试要求值不在时,它将被删除。
就我个人而言,我不相信这是值得的,因为它有点模糊的东西(如你所发现的),但这就是它。
关键是在测试中只使用与测试用例相关的代码。在测试没有名称的用户是否有效时,唯一相关的属性是name属性。这个测试不应该知道任何关于email属性的信息。
假设您为新字段的存在添加验证—您必须更新每个构建没有该字段的User的测试。有了顶部的attr
哈希,您只需在那里弹出新字段,所有的测试都很好。
为测试创建对象是一个非常常见的问题,有很多解决方案,关于哪种方法最好的讨论也很多。我建议你去工厂看看。Machinist和FactoryGirl是Rails的两个很好的选择。