【问题标题】:How to test a method which uses caller in ruby?如何测试在 ruby​​ 中使用调用者的方法?
【发布时间】:2012-08-16 22:27:22
【问题描述】:

我有一个私有方法,它根据调用者方法返回一些东西:

private
def aPrivateMethod
  r = nil
  caller_method = caller[0][/`([^']*)'/, 1]

  case caller_method
     when "method_1"
        r = "I was called by method_1"
     when "method_2"
        r = "I was called by method_2"
  end

  return r
end

在编写测试单元时,调用这个私有方法的方法名不会是method_1也不是method_2,它会以test开头,我找不到返回测试通过的解决方案。

【问题讨论】:

  • 我很好奇你为什么要做这样的事情——我从来没有想过测试哪个对象正在调用另一个对象。在我看来,如果这很重要,那么被测代码过于紧密耦合,或者需要重构以允许直接的单元测试。
  • 代码很可能需要重构,但在它的初始状态下,我看不到如何重构。不要问为什么。 :)

标签: ruby unit-testing


【解决方案1】:

您可以为此目的在您的测试类中创建一个代理方法

def method_1 *args
  aPrivateMethod *args
end

然后从你的测试中调用这个方法。

【讨论】:

    【解决方案2】:

    在 case 表达式中使用正则表达式:

    def aPrivateMethod
      caller_method = caller[0][/`([^']*)'/, 1]
    
      case caller_method
         when "method_1"
            "I was called by method_1"
         when "method_2"
            "I was called by method_2"
         when /^test_\d+/
            "test call from #{caller_method}"
         else nil
      end
    end
    

    另外,你有很多多余的代码......根本不需要 r 变量。

    【讨论】:

    • 感谢您的回答。引用 r 和其他代码行的代码已经变得像一个“标准”,我不得不使用它。
    猜你喜欢
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多