1

我正在尝试测试一个相当大的 Rails 应用程序,我可能一直都应该这样做,但从来没有完全适应过。现在我正在进行功能测试以查看是否成功创建了用户。基本上,我想测试一些东西:

  • 用户是否被保存(即,如果数据库中有新记录)
  • 他的信息(姓名、电子邮件等)是否正确
  • before_create 是否有几个字段已自动添加到数据库中
  • 是否发送了电子邮件
  • 电子邮件文本是否合适(即替代电子邮件模板中的用户名和激活链接)

据我了解,单元测试旨在测试模型,功能测试应该测试控制器。我上面提到的几个测试应该是单元测试,正如我所看到的 - 具体来说,我认为我可以确保输入正确映射到数据库字段,并且 before_create 过滤器在使用用户模型的单元测试中工作。

其他人似乎要求进行功能测试——是否发送了电子邮件(可能还有它的文本——尽管这可能属于 UserEmail 测试?)以及是否有新记录。

这是关于模拟/存根的问题。在用户控制器功能测试中,我应该确保使用适当的参数调用 user.save,还是应该测试数据库是否获得新记录?前者似乎需要一个存根,并假设,由于 Rails 已经过很好的测试,如果在用户模型上调用 .save,对象将被成功保存。但后者(例如,调用 assert_difference)感觉更彻底。选择哪个?

抱歉,如果这个问题涉及太多了——我知道这是一个很大的话题,但我希望理解这样一个特定的(如果很长)示例将在总体上澄清很多关于测试的内容。

谢谢!

4

2 回答 2

1

这不是一个容易回答的问题。在 Rails 世界中基本上有两个阵营。一个阵营会告诉你使用模拟,因为它会使你的测试更快。另一个阵营会告诉您使用数据库进行测试,因为它会更加“忠实”,因为它会测试数据库表是否具有正确的列,而模拟不会这样做。两个阵营都会告诉你他们的测试风格更清晰:-)

我的建议是先尝试一种方法,然后再尝试另一种。看看什么对你有用。最重要的是要确保您的测试清晰且富有表现力。您可以在 Gregg Pollack 的演示文稿中找到有关如何开始测试 Rails的提示。

于 2010-07-31T13:04:15.920 回答
1

我喜欢进行功能测试的方式是不模拟/存根任何东西。基本上,一般来说,存根/模拟对于单元测试非常有用,因为它允许您隔离类或功能单元。现在,当涉及到集成和功能测试时,目的是测试“实际”类的交互,因此您希望避免模拟/存根。

因此,在您的情况下,我会在为用户控制器进行功能级别测试时涉及数据库。如果您决定存根持久层,我认为您正在对控制器进行单元测试(假设没有其他依赖项) - 这样的测试不会让您发现持久层的问题(例如,数据库中的不兼容更改架构、数据库连接问题等)。

底线是这两种做法都是有效的,但适当的做法取决于您的目标是什么(即功能、集成或单元测试)。

于 2010-09-22T14:59:09.267 回答