【问题标题】:Railstutorial.org Validating presence testsRailstutorial.org 验证存在测试
【发布时间】:2011-09-13 22:53:25
【问题描述】:

我一直在学习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 结构会有所帮助,而不是仅使用姓名和电子邮件的这种相当简单的情况。

有人有意见吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        • 2012-06-29
        • 2012-03-02
        • 2020-10-23
        相关资源
        最近更新 更多