在Rspec中测试抽象类

时间:2015-01-23 16:45:52

标签: ruby rspec

在我的Ruby库中,我有一些旨在通过继承使用的类。因此,我在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 :allafter :each块正确取消定义更加困难。

3 个答案:

答案 0 :(得分:9)

一种可能性是使用anonymous classes

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

这样就没有必要进行清理了。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

before do
  stub_const('MyClass', fooMyClass)
end

使MyClass可用作规范中的常量。如果类的行为取决于它的名称(这有时在花哨的元编程中完成),这很有用。