我正在尝试测试一个相当大的 Rails 应用程序,我可能应该一直这样做,但从来没有感到完全舒服。现在我正在进行功能测试,看看是否成功创建了用户。基本上,我想测试一些东西:
- 用户是否已保存(即,数据库中是否有新记录)
- 他的信息(姓名、电子邮件等)是否正确
- 是否有几个字段在创建之前自动添加到数据库中
- 是否发送了邮件
- 电子邮件文本是否合适(即替换电子邮件模板中的用户名和激活链接)
据我了解,单元测试旨在测试模型,而功能测试应该测试 Controller 。我上面提到的几个测试应该是单元测试,正如我所看到的——具体来说,我认为我可以确保输入正确映射到数据库字段,并且 before_create 过滤器在使用用户模型的单元测试中工作。
其他人似乎要求进行功能测试——是否发送了电子邮件(可能还有它的文本——尽管这可能属于 UserEmail 测试?)以及是否有新记录。
这是关于 mocking/stubbing 的问题。在用户 Controller 功能测试中,我应该只确保使用适当的参数调用 user.save,还是应该测试数据库是否获得了新记录?前者似乎需要一个 stub ,并假设,由于 Rails 已经过良好测试,如果在用户模型上调用 .save,对象将被成功保存。但后者(例如,调用 assert_difference)感觉更彻底。选择哪个?
很抱歉,如果这个问题过于复杂——我知道这是一个很大的话题,但我希望理解像这样的特定(如果很长)示例将阐明很多关于测试的一般知识。
谢谢!
最佳答案
这不是一个容易回答的问题。基本上 there are two camps在 Rails 世界中。一个营地会告诉你使用模拟,因为它会让你的测试更快。另一个阵营会告诉您使用数据库进行测试,因为它会更“忠实”,因为它会测试数据库表是否具有正确的列,而模拟不会这样做。两个阵营都会告诉你他们的测试风格更清晰:-)
我的建议是先尝试一种方式,然后再尝试另一种方式。看看什么对你有用。最重要的是要确保您的测试清晰且富有表现力。您可以找到有关如何开始测试 Rails 的提示 in this presentation by Gregg Pollack .
关于ruby-on-rails - 在哪里/什么测试?模拟、 stub 、函数式、单元...(在 Ruby/Rails 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3367975/