Rspec 中的测试摘要 类

Testing abstract classes in Rspec

在我的 Ruby 库中,我有一些 class 旨在通过继承使用的元素。因此,我在规范文件中做的第一件事就是定义自定义 Foo class:

module MyGem
  describe MyClass do
    class FooMyClass < MyClass
      ...
    end
  end
end

问题是定义的 class 会泄漏给其他测试,必须小心使用唯一名称或使用 after :all 块删除 class。

考虑到 Rspec 已经给出的所有魔法,这感觉有点手动。有没有更好的方法来定义抽象 classes 的规范?大多数情况下,我想要一种简单的方法来清除所有临时声明的名称空间。

当我这样定义多个class时,清理起来特别烦人:

module MyGem
  describe MyClass do
     ... 
  end

  class FooMyClass < MyClass
    ...
  end
  describe FooMyClass do
    ...
  end
end

使用 after :allafter :each 块更难正确取消定义。

一种可能是使用 anonymous classes.

  let(:fooMyClass) do
    Class.new(MyClass) do
      # ...
    end
  end

这样就不用清理了

describe MyClass do
  let(:klass) { Class.new(MyClass) }
  it "works without assigning a constant name" do
    obj = klass.new
    expect(obj).to be_kind_of(MyClass)
  end
end

在测试中创建常量总是很痛苦,这是我使用过的一个有用的解决方法。

根据@hjing的回答,也可以用stub_const

before do
  stub_const('MyClass', fooMyClass)
end

这使得 MyClass 在您的规格中可作为常量使用。如果 class 的行为取决于它的名称(有时在花哨的元编程中就是这样做的),这很有用。