如何使用 aspector gem 来包装 class 方法?

How to use the aspector gem to wrap class methods?

我正在使用 ruby 方面 gem 进行一些代码检测,但除了实例方法之外,我还需要检测 class 方法。当我 运行 下面的代码时,我得到

Foo.bar(baz)

但我预料到了

Foo.bar executed with result => Foo.bar(baz)

Foo.bar(baz)

如何获得预期结果?

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")

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