Railstutorial.org验证状态测试

时间:2011-09-13 22:53:26

标签: ruby-on-rails tdd rspec-rails

我一直在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结构是有帮助的,而不是只有名称和电子邮件这种相当简单的情况。

有人有任何意见吗?

2 个答案:

答案 0 :(得分:1)

所以有一个标准的属性映射可以在所有测试中使用。当测试要求不是时,它就会被删除。

就我个人而言,我并不相信它是值得的,因为它会混淆一些东西(正如你所发现的那样),但它确实存在。

答案 1 :(得分:1)

关键是只有代码与测试中的测试用例相关。测试用户在没有名称时无效的唯一相关属性是name属性。该测试不应该对电子邮件属性有任何了解。

假设您为新字段的存在添加了验证 - 您必须更新在没有该字段的情况下构建用户的每个测试。使用顶部的attr哈希,您只需在其中弹出新字段,所有测试都可以。

创建测试对象是一个很常见的问题,有很多解决方案,并且讨论哪种方式最好。我建议你看看工厂。 Machinist和FactoryGirl是两种适用于Rails的替代方案。