我一直在学习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 block语句并简单地写下时,为什么要不厌其烦地将一个空白字符串合并到@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变量来验证电子邮件地址的存在,这是他使用block语句的原因之一--对我来说,遵循第二个block引号的结构更有意义。尽管如此,我还是有一种感觉,我在这里遗漏了什么。
我脑海中浮现的另一种解释是,当有很多键需要输入时,使用@attr结构很有帮助,而不是这种只有姓名和电子邮件的简单情况。
有人有什么建议吗?
发布于 2011-09-14 07:23:42
所以有一个标准的属性映射可以在所有的测试中使用。当一个测试要求一个值不在那里时,它会被删除。
就我个人而言,我不相信这是值得的,因为它有点混淆了事情(如您所发现的),但它就是这样。
发布于 2011-09-15 05:28:17
重点是在测试中只有与测试用例相关的代码。在测试没有名字的用户是否有效时,唯一相关的属性是name属性。该测试应该不需要知道任何关于电子邮件属性的信息。
比方说,你添加了一个新字段的验证--你必须更新你在没有该字段的情况下建立用户的每一个测试。使用顶部的attr散列,您只需在其中弹出新字段,您的所有测试都是正常的。
创建用于测试的对象是一个很常见的问题,有很多解决方案,并且有很多关于哪种方法是最好的讨论。我建议你去工厂看看。Machinist和FactoryGirl是两个可以很好地使用Rails的替代方案。
https://stackoverflow.com/questions/7409498
复制相似问题