3

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

在查看其他可用数据后,我对这个选择充满信心,因为模型的实际数据是相同的,只是行为不同。非常适合 STI。

可以创建、启动、推进和完成任务。这是这些转换中涉及的一些逻辑,尤其start()是要求对基类进行专门化的逻辑。

由于我正在执行此 TDD 并开始使用具有完整测试覆盖率的工作任务调用,我现在想知道如何继续。我有几个我想过的情景:

  1. 复制 Task 的测试并端到端测试 Activity 和 Training 并进行一些小的修改以测试它们的专业化。优点:快速简单。缺点:它会重复代码,虽然这在这里可能不是什么大问题,但当专业化数量增加时就会出现问题。

  2. 拆分测试并保留大部分测试代码,task_spec.rb同时将专业化测试转移到各个子类的新规范中。优点:保持测试干燥。缺点:我在基础测试中实例化什么类?

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

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

4

2 回答 2

13

使用 rspec 共享示例(由 Renato Zannon 提到)将如下所示:

spec/support/. 我会打电话shared_examples_for_sti.rb的。

require 'spec_helper'

shared_examples "an STI class" do

  it "should have attribute type" do
    expect(subject).to have_attribute :type
  end

  it "should initialize successfully as an instance of the described class" do
    expect(subject).to be_a_kind_of described_class
  end

end

_spec.rb每个 STI 类及其子类的文件中,添加以下行:

it_behaves_like "an STI class"

如果您有任何其他要在 STI 类和子类之间共享的测试,只需将它们添加到shared_examples.

于 2013-07-09T16:46:19.057 回答
5

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

于 2013-02-03T15:10:39.910 回答