在Rspec中测试抽象类

在我的Ruby库中,我有一些旨在通过inheritance使用的类。 因此,我在spec文件中做的第一件事就是定义一个自定义的Foo类:

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

问题是定义的类将泄漏到其他测试,并且必须小心使用唯一名称或使用after :all块删除类。

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

当我定义多个这样的类时清理它是特别烦人的:

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

after :all正确地取消定义甚至更难after :allafter :each块。

一种可能性是使用匿名类 。

  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在您的规格中可用作常量。 如果类的行为取决于其名称(这有时在花哨的元编程中完成),这将非常有用。