为什么RSpec不执行行为?

时间:2011-02-23 00:20:02

标签: ruby-on-rails rspec

我知道rspec用于测试特定的例子,但在我看来,大多数时候错误是动态的。因此,我有一些疑问,如果单元测试对我来说真的有用(我当然没有说rspec没用)。

我在想如果我在模型上添加验证,这会强制执行其行为。既然我已经知道我会说,首先为它创建测试背后的真正意义是什么?毕竟,如果我不更改验证,它将永远通过(在这种情况下,我会注意到)。如果我是唯一的开发人员,那没有真正的理由那么多工作吗?

此外,假设我有一个测试,指定user.name必须是'Tom'或'John'。我的测试工作得很好,因为我在测试中指定了user.name。但是,在实际应用中,名称可能会变为'Alex'。 Rspec无法强制执行此行为,是吗?

我会留下通过测试,但是错误。

你怎么看待这一切?我的担忧是正确的还是我没有考虑好?我需要知道我是否会因为搞乱rspec而获得一些好处,或者这大部分都是浪费时间。

(我再次理解rspec可能很有用,但我在这里指定的内容呢?)

3 个答案:

答案 0 :(得分:1)

测试是测试。他们测试的东西。他们没有执行任何事情。

它们非常有用,因为您可以查看应用程序中的内容和内容。当你覆盖那个name= setter来做一些奇特的事情并且它打破了你为其编写测试的简单案例时,该测试只是保存了你的屁股。对于像这样的简单情况,没有测试可能没问题。在非开源应用程序中看到100%的测试覆盖率是非常罕见的。但是,在你了解不需要测试的内容之前,只需编写测试就可以更容易了。

如果你不了解测试驱动开发或者为什么要测试,我认为你应该谷歌关于这个主题,你可以很好地了解那里有什么以及为什么要使用它(和你应该)。

答案 1 :(得分:1)

在我看来,测试用例有点像记录需求。我们通过测试时确保满足这些要求。第一次它没有意义,因为我们将编写带有需求的代码。当我们必须更改代码以包含其他内容(或者只是为了性能而折射代码)时,测试才真正发挥作用。这次,我们必须确保在进行更改时也满足先前的要求,即测试用例不会失败。这样,通过测试,当我们更改或折射代码时,我们会记录要求并确保满足要求。

答案 2 :(得分:1)

  

我想如果我在模型上添加验证,则会强制执行其行为。

为模型添加验证模型提供了某些行为,但强制执行。仅当某些其他代码依赖于它时才需要行为,并且如果它发生更改则会中断。在使用行为之前删除它不会对您的项目产生任何影响,因此没有任何内容强制执行必须存在的行为。

  

既然我已经知道我会说,首先为它创建测试背后的真正意义是什么?毕竟,如果我不改变验证,它将永远通过(在这种情况下我会注意到)。

编写测试,特别是首先编写测试,可以立即使用您的代码。需要行为存在的行为,如果行为发生变化,应该快速,可靠,自动地失败。测试强制执行代码的公共接口,否则您将更改该接口,并且通知。

  

如果我是唯一的开发人员,那不是没有真正原因的那么多工作吗?

您可能是唯一一个从事该项目的人,但您无法记住所有事情。写下测试,以便下周你有一些事情可以确保你没有违反你今天做出的假设。

  

此外,假设我有一个测试,指定user.name必须是'Tom'或'John'。

这不足以成为一个好的测试。您可以测试“当user.name为'Tom'时用户应该有效”或者'[Tom','John']中必须包含“user.name”或者甚至“如果user.name用户应该无效”是'亚历克斯'“。您不能希望为应用程序的所有可能输入编写测试,因此您需要对要测试的内容做出明智的选择。测试有效输入是否产生有效结果。测试无效输入以预期方式失败。不要担心测试所有可能的无效输入或代码的无效使用。

如果“user.name”无效为“Alex”,那么您可能应该测试调用User对象的代码不会尝试将其名称设置为“Alex”。如果“Alex”是一个有效的名称,但您的代码仍然失败,那么您应该编写更强大的代码,更好的测试以及对“Alex”这个名称的测试,以确保修复了User类来处理该名称。

也许最重要的是,如果您先编写测试,那么他们实际上可以驱使您为User类设计更好的界面。一个更清楚地表达“name”属性的行为并且不鼓励你设置无效名称。