验证状态测试



我一直在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的两个很好的选择。

相关内容

  • 没有找到相关文章

最新更新