Rails中的TDD:关于红 - 绿测试的澄清

时间:2015-03-27 14:40:39

标签: ruby-on-rails ruby tdd

根据Michael Hartl的Rails tutorial,我不确定以下验证测试应如何工作:

test "name should be present" do
  @user.name = "     "
  assert_not @user.valid?
end

编写此测试时,测试套件应为Red。在User类中添加相应的部分后:

class User < ActiveRecord::Base
  validates :name, presence: true
end

测试变为绿色。我不明白前一部分是如何运作的。测试为红色是因为validates部分尚未实现吗?实施后,@user.valid?应该FalseTrue而变为assert_not。因此,测试是绿色的吗?

3 个答案:

答案 0 :(得分:2)

您对此有正确的理解。在将Rails中的模型保存到数据库之前,必须对其进行验证。此处的测试是检查用户模型是否被视为有效并使用空白名称保存。因此,在添加validates :name, presence: true之前,@user.valid?的计算结果为true,测试失败。添加验证后,模型将被视为无效。

答案 1 :(得分:0)

在测试驱动开发(TDD)方法中,我们在编写代码之前编写测试。因此,我们首先使测试失败,然后编写一些代码以使测试通过。

答案 2 :(得分:0)

看起来你对正在发生的事情有了正确的认识。

assert_not @user.valid?表示@user对象无效。以@user.name开头设置为空值;所以我们期望断言通过。但是,代码尚未检查是否存在有效名称。所以它失败了。

添加validates :name, presence: true会使模型检查是否存在有效名称。因此测试通过了。