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 :all
或 after :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 的行为取决于它的名称(有时在花哨的元编程中就是这样做的),这很有用。
在我的 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 :all
或 after :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 的行为取决于它的名称(有时在花哨的元编程中就是这样做的),这很有用。