给定一个继承自 ActiveRecord::Base 的类,我们称它为 Task,我有两个子类使用标准 Rails 单表继承来专门处理任务的某些方面,Activity 和 Training。
在查看其他可用数据后,我对这个选择充满信心,因为模型的实际数据相同,只是行为不同。非常适合 STI。
可以创建、开始、进行和完成任务。这是这些转换中涉及的一些逻辑,尤其是 start()
,它要求对基类进行专门化。
由于我正在执行此 TDD 并开始使用具有完整测试覆盖率的工作任务调用,所以我现在想知道如何继续。我有一些我想过的场景:
复制 Task 的测试,并通过一些小的修改来测试 Activity 和 Training 端到端,以测试它们的特化。亲:它又快又容易。缺点:它会重复代码,虽然这在这里可能不是什么大问题,但当特化数量增加时就会成为问题。
拆分测试并将大部分测试代码保留在
task_spec.rb
中,同时将特化测试移至各个子类的新规范中。 Pro:保持测试干燥。缺点:我在基础测试中实例化了什么类?
最后一个问题困扰着我。现在我已经将基类测试设置为从其中一个音乐会子类中随机创建一个类,但这种形式好吗?这几乎让我想采用方法 1 只是为了保持测试运行的一致性,否则我将不得不找到一种方法来确定我的类选择随机种子的随机性,以便我至少有一个可重复的随机选择。
我猜这一定是人们遇到的一个常见问题,但我找不到关于该主题的任何有用信息。您对此事有任何资源或想法吗?
最佳答案
使用 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
在每个 STI 类及其子类的 _spec.rb
文件中,添加以下行:
it_behaves_like "an STI class"
如果您有任何其他想要在 STI 类和子类之间共享的测试,只需将它们添加到 shared_examples
即可。
关于ruby-on-rails - 使用 rspec 测试 Rails STI 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14546621/