首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隔离间歇性失败的元编程规范(开放类/猴子修补程序)

隔离间歇性失败的元编程规范(开放类/猴子修补程序)
EN

Stack Overflow用户
提问于 2015-09-25 16:27:33
回答 1查看 29关注 0票数 1

我试图重构当前通过或失败的规范,该规范基于示例的运行顺序。

规格低于标准。

如果第一个示例先运行,规范就会通过。

如果第二个测试在第一个测试之前运行,它将失败。我理解它失败的原因--在FieldExtractor中有三个ObjectSpace子类,所以断言expect(FieldExtractor.all.size).to eq 2将是假的。

代码语言:javascript
复制
RSpec.describe FieldExtractor do

  it 'keeps track of subclasses' do
    class TotalExtractor < FieldExtractor
    end
    class VendorExtractor < FieldExtractor
    end

    expect(FieldExtractor.all).to include(TotalExtractor)
    expect(FieldExtractor.all).to include(VendorExtractor)
    expect(FieldExtractor.all.size).to eq 2
  end

  it 'keeps track of extracted field' do
    class ConfiguredExtractor < FieldExtractor
      extracts :vendor
    end

    expect(ConfiguredExtractor.field).to eq :vendor
  end
end

我的问题是如何解决这个间歇性的测试失败。

有什么优雅的方法吗?我是用这种方式来测试这个的吗?

我得到的一个解决方案是在规范开始时(在示例之外)定义所有的子类,这样我就知道应该有多少个子类。我不喜欢这个解决方案,因为我有很多有很多子类的例子,而且它似乎没有很好的扩展性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-25 18:34:12

您可以使用常量对未定义的const进行存根,测试执行后将自动删除该命令:

代码语言:javascript
复制
it 'keeps track of subclasses' do
  stub_const('TotalExtractor', Class.new(FieldExtractor))
  stub_const('VendorExtractor', Class.new(FieldExtractor))

  expect(FieldExtractor.all).to include(TotalExtractor)
  expect(FieldExtractor.all).to include(VendorExtractor)
  expect(FieldExtractor.all.size).to eq 2
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32786683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档