ruby-on-rails - 使用RSpec测试Rails STI子类

原文 标签 ruby-on-rails unit-testing testing rspec tdd

给定一个从ActiveRecord :: Base继承的类,我们称之为Task,我有两个子类,它们使用标准的Rails单表继承来专门化任务的某些方面,Activity和Training。

在查看其他可用数据后,我对该选择充满信心,因为模型的实际数据相同,只是行为有所不同。 STI的理想选择。

可以创建,开始,进行和完成任务。这些转换涉及某些逻辑,尤其是start(),需要特殊化基类。

由于我正在执行此TDD,并且从一个工作正常的Task调用开始,并且具有完整的测试覆盖范围,所以我现在想知道如何进行。我已经考虑过一些问题:


复制Task的测试,并通过一些小的修改来端对端测试Activity和Training,以测试其专业性。优点:快速简便。缺点:它重复了代码,虽然在这里可能不是什么大问题,但是专业化的数量会增加。
拆分测试并将大多数测试代码保存在task_spec.rb中,同时将专业化测试迁移到各个子类的新规范中。优点:保持测试干燥。缺点:我可以在基础测试中实例化哪个类?


最后一个问题是什么困扰着我。现在,我已经设置了基类测试,可以从一个Concert子类中随机创建一个类,但这是一种好形式吗?几乎让我想采用方法1只是为了保持测试运行的一致性,否则我将不得不找到一种方法来为测试套件建立基于我的随机种子的类选择的随机性,以便至少具有可重复性。随机选择。

我猜想这肯定是人们遇到的一个普遍问题,但是我找不到关于此主题的任何好的信息。您对此事有任何资源或想法吗?

最佳答案

您可以使用rspec shared examples来测试它们之间共享的行为(基本上是继承的行为,或要防止LSP违规的地方)。

相关文章:

ruby-on-rails - 如何测试使用系统命令的代码

ruby-on-rails - 使用创建和更新操作将Single Rails表单管理到其他 Controller

ruby-on-rails - 如何以异步方式(在不同线程中)处理Rails观察器和回调?

mysql - 在Node.js单元测试中将MySQL自动增量重置为拆卸步骤

javascript - 在React Native项目中开 Jest 进行单元测试(“Not a function”错误)

linux - 如何使本地终止的TCP连接通过预路由和后路由?

ruby-on-rails - Rails4 has_many通过参数

sql - 选择所有用户,按其评论数排序

java - 如何“拦截”方法进行测试?

java - 使用HSQLDB测试日期值