我使用ruby aspector gem来做一些代码检测,但除了实例方法之外我还需要检测类方法。当我运行下面的代码时,我得到了
Foo.bar(巴兹)
但我期待
使用result =>执行Foo.bar Foo.bar(巴兹)
Foo.bar(巴兹)
如何获得预期结果?
require 'aspector'
class Foo
def self.bar(msg)
"Foo.bar(#{msg})"
end
end
class FooAspect < Aspector::Base
around :bar, method_arg: true do |method, proxy, *args, &block|
name = "#{self.class}.#{method}"
result = proxy.call(*args, &block)
warn "#{name} executed with result => #{result}"
result
end
end
FooAspect.apply(Foo)
puts Foo.bar("baz")
答案 0 :(得分:3)
Aspector中的文档很差,但您可以随时转到spec/functionals并尝试找到解决方案。
关于你的案子。在应用您的方面时,只需使用class_methods: true
选项:
FooAspect.apply(Foo, class_methods: true)
完整代码列表:
require 'aspector'
class Foo
def self.bar(message)
puts message
end
end
class FooAspect < Aspector::Base
around :bar, method_arg: true do |method, proxy, *args, &block|
puts 'start'
proxy.call(*args, &block)
puts 'end'
end
end
FooAspect.apply(Foo, class_methods: true)
Foo.bar('execute')
=> start
=> execute
=> end