Rails TDD - 首先要写什么

时间:2011-12-10 12:12:19

标签: ruby-on-rails tdd

我刚刚使用Rails进入TDD。令我困惑的是“何时编写测试”。所有指南都建议您在编写任何代码之前编写测试,但如果我创建Person模型,然后在编写任何代码之前编写以下测试;

p = Person.new
p.firstname = "mikey"
p.lastname = "hogarth"
assert_equal p.fullname, "mikey hogarth"
然后测试本身不会失败,它会崩溃!因为我还没有实现“fullname”方法,所以我会遇到运行时错误。因此,在我编写代码之前,我无法使测试失败。

TDD程序员通常如何处理这种情况?它基本上是使用虚拟方法存根还是有更好的方法?

=== EDIT ===

建议了很多好主意。我最终决定以下选项实现我想要做的最优雅的事情;

if p.respond_to? "fullname"
  assert_equal "Mikey Hogarth", p.fullname
else
  flunk "fullname not implemented"
end

===第二次编辑===

如果你偶然发现这个答案,似乎我对TDD的整个方法都是问题所在,所以虽然上面的代码可行,但这不是一个好习惯。

3 个答案:

答案 0 :(得分:3)

您想要编写您希望拥有的代码。在C风格的语言/静态编译的语言中,上面甚至不会编译,因为你正确地说明代码不存在。这很好,然后您将实现最低限度来构建代码以运行测试。换句话说,您的测试可以推动您的设计。

我的Ruby非常生疏,但在上面的示例中,对于不存在的方法/属性,将抛出method_missing行的内容。因此你会创建它们。

class Person
  attr_accessor :firstname, :lastname

  def fullname

  end
end

如果您现在运行测试,您将从全名返回nil。因此,我们将实现fullname方法。这里需要注意的是,消息已经改变,而不是Ruby抱怨丢失的方法,测试正在呻吟我们没有正确实现这些方法。

def fullname
   return @firstname + " " + @lastname
end

现在你的测试将通过。

基本上你想要在运行后更改测试显示的消息(这将证明你正在某个地方),或者你想让它通过。测试通过后,您可以重构。上面的方法很简单,但你可以删除return语句,使用字符串格式或其他。只要测试过后,你就知道你很高兴。

答案 1 :(得分:1)

测试代码在这些情况下崩溃是可以的。将其视为失败。

在实际开始实现此类之前,在实际代码之前编写测试代码将使您能够设计被测试类的接口。你将有一个类使用的例子,这很棒!

在此之后,您将需要创建正在测试的实际类,测试将失败,而不是崩溃。然后让这个测试通过,重构并继续编写失败的测试。

答案 2 :(得分:0)

我的方法是使用 该测试的条件检查p.fullname.nil?,或简单地将assert_not_nil(p.fullname)作为先前的测试,当失败时将阻止剩余的测试执行。