2

我一直在阅读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何时可以摆脱 :each 块语句并简单地编写:

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我想到的另一种解释是,当需要输入很多键时,它有助于使用该结构,而不是仅使用名称和电子邮件的这种相当简单的情况。

有人有意见吗?

4

2 回答 2

1

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

就个人而言,我不相信这是值得的,因为它会混淆事物(正如你所发现的那样),但确实如此。

于 2011-09-13T23:23:42.453 回答
1

关键是在测试中只有与测试用例相关的代码。在测试没有名称的用户无效时,唯一相关的属性是名称属性。该测试不必知道任何有关电子邮件属性的信息。

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

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

于 2011-09-14T21:28:17.317 回答