作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在编写一些 rspec 来测试一些模块是否正确实现了它们的行为。
模块看起来像这样:
module Under::Test
def some_behaviour
end
end
我不能在 RSpec 中这样做:
describe Under::Test do
subject {Class.new{include described_class}.new}
在调用 #described_class
时,它无法再解析,因为 self 是 Class 的实例,它没有 #describe_class 方法。所以我不得不重复一遍:
subject {Class.new{include Under::Test}.new}
或者在规范中以与我的客户使用它的方式不同的方式使用它:
subject {Object.new.extend described_class}
这具有相同的最终效果,但我内心的某些想法认为,如果我要求我的客户包含 Under::Test
,那么测试应该看起来尽可能接近他们的使用方式尽可能。
我可以使用闭包属性来解决这个问题,但我想知道它是否更好。这有代码味道吗?
describe Under::Test do
subject {mudule = described_class;Class.new{include mudule}.new}
it 'has some behaviour' do
expect(subject.some_behaviour).to be
end
end
注意,我也在 reddit 上的 r/ruby 中询问过,那里有人建议:
subject {Class.new.include(described_class).new}
这可能是我的方式。
最佳答案
如果您的最终目标是在新创建的 Class
中包含
当前 described_class
模块,那么以下解决方法如何?
RSpec.describe NewModule do
let(:test_class) do
Class.new.tap do |klass|
klass.include(described_class)
end
end
specify do
expect(test_class.ancestors).to include described_class # passes
end
end
下面是一个在对象中包含模块方法的示例:
module NewModule
def identity
itself
end
end
RSpec.describe NewModule do
let(:one) do
1.tap do |obj|
obj.class.include(described_class)
end
end
specify do
expect(one.identity).to eq 1 # passes
end
end
请注意,Class
的 include
方法在 Ruby v2+ 中不是 private
。如果您使用的是旧版本,则必须使用 klass_name.send(:include, described_class)
关于ruby - 在包含被测模块时使用 described_class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33601898/
我是一名优秀的程序员,十分优秀!