ruby-on-rails - 在哪里/什么测试?模拟、 stub 、函数式、单元...(在 Ruby/Rails 中)?

标签 ruby-on-rails unit-testing testing functional-testing stubbing

我正在尝试测试一个相当大的 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/

相关文章:

ruby-on-rails - Rails 参数 escape/unescape +

javascript - 如何用 Jest 模拟 redux Action

testing - 如何使用不同版本的先决条件来运行我的包的测试?

unit-testing - 模拟 LINQ To SQL 数据提供程序,实时代码上的 NotSupportedException

java - 如何对成熟的 Android 应用程序运行集成测试?

typescript - Jest/ Jasmine : Weird Execution Order Of beforeEach()

ruby-on-rails - sqlite & rails : Change primary key column?

html - Rails CSS 中 link_to image_tag 上的圆 Angular

ruby-on-rails - 为什么无法向该对象添加 RSpec stub 方法?

android - Jetpack Compose,如何测试导航?