【问题标题】:test loop return value in rspecrspec 中的测试循环返回值
【发布时间】:2014-11-06 10:44:26
【问题描述】:

我需要测试如下方法

class Something
  def test_method
   count = 0
   arr = []
   max = 500
    puts "test_method"
    loop do
      arr += count if count.even?
      count += 1
    end break if count > max
    return arr
  end
end

所以基本上我需要测试 test_method() 是否返回一个数组实例并且 arr 大小是否大于 3。 但我不想每次都进入这个循环并返回结果。那么在 rspec 中有什么方法可以存根最大值并返回数组而不循环 500 次。

【问题讨论】:

  • max 作为参数传递。
  • 我不想编辑编写的方法(test_method)。那么没有那个有什么办法吗??
  • 不,不是这个方法的写法。 max 是“硬编码”的,你不能存根局部变量。
  • 顺便说一句,您的方法实际上并没有运行。 arr += count 不起作用,break 在您的 loop 之外

标签: ruby rspec


【解决方案1】:

您可以使用class_variable_set 方法。

class Something
  @@max = 500

  def test_method
   count = 0
   arr = []

    puts "test_method"
    loop do
      arr += count if count.even?
      count += 1
    end break if count > @@max
    return arr
  end
end

在您的情况下,rspec before_each 块可能如下所示:

before(:each) { Something.class_variable_set :@@max, 20 }

您也可以使用instance_variable,如this answer 中所述

【讨论】:

    【解决方案2】:

    也许可以将max 作为可选参数传递给该方法?

    class Something
      def test_method(max = 500)
        count = 0
        arr = []
        puts "test_method"
        # ...
      end
    end
    

    【讨论】:

    • 不传递 max 作为参数,有什么方法可以实现吗??
    • 问题是在这个 test_method 中设置了最大参数。所以它不能被硬编码,因为我们不会提前知道 max 的值
    • 如果您在没有参数的情况下调用该方法 (test_method),那么 max 将是 500,就像在您的示例中一样。但是如果你想运行测试会使max 的值变小,你可以使用参数调用该方法(例如test_method(5))。除此之外:不,您不能更改在规范中的方法中分配的局部变量。它必须在方法之外定义。
    • @rubyist “我们不会提前知道最大值” 你能解释一下吗?在您的代码中,max 设置为 500
    • 那只是一个伪代码。。我原来的代码是这样的stackoverflow.com/questions/26776782/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多