我已经开始在我的新工作中与装饰师合作,并且发现他们真的很有帮助。我正在为我们的一个装饰师编写规格,并想知道是否可以这样做......
设置(精简版):
我们有一个有两个孩子的主要对象。
Main
/ \
A B
当Main被装饰时我们也装饰B,但我们必须通过A作为上下文。 A用于B的一些装饰器方法,但如上所述将A与B分开更具逻辑意义。
# in MainDecorator
BDecorator.new(B, context: {a: A}) # all good
偶尔我们自己装饰B(不经过Main),我们忘记过去通过A作为上下文。我们总是抓住它,但这仍是一个令人讨厌的问题。
B.decorate # no context -> :(
问题:
是否可以验证A是否在B的装饰器中作为上下文传递?你有装饰验证器吗?
(我们考虑让A成为B的孩子,但这对我们的申请来说并不合理。我同意它会起作用,但这不是我们想要的。)
答案 0 :(得分:2)
您可以覆盖初始化程序以验证是否传递了上下文:
class BDecorator
def initialize(obj, options = {})
raise "Must pass context" unless options.key? :context
super
end
end