Ruby Rspec:测试实例变量而不添加源的访问器

ste*_*her 74 ruby rspec instance-variables

我正在尝试测试以下方法:

def unprocess_move(board, move)
  if move[0].instance_of?(Array)
    multi_move = @multi_move.pop(2).reverse
    multi_move.each do |single_move|
      unapply_move(board, single_move)
    end
  else
    board = unapply_move(board, move)
  end
  board
end
Run Code Online (Sandbox Code Playgroud)

我想为@multi_move设置状态,但我不想添加一个仅用于测试的访问器.没有访问器有没有办法这样做?谢谢.

KL-*_*L-7 126

您可以使用Object#instance_variable_get方法获取对象的任何实例变量的值,如下所示:

class Foo 
  def initialize
    @foo = 5 # no accessor for that variable
  end 
end

foo = Foo.new
puts foo.instance_variable_get(:@foo)
#=> 5
Run Code Online (Sandbox Code Playgroud)

并且Object#instance_variable_set可以用来设置实例变量的值:

foo.instance_variable_set(:@foo, 12) 
puts foo.instance_variable_get(:@foo)
#=> 12
Run Code Online (Sandbox Code Playgroud)

  • @steve_gallagher,我认为之前你没有看到过的原因是对象的私有状态不是你应该在大多数情况下测试的.如果你的目标是测试某个对象的行为和逻辑,你应该测试它的作用,但不测试它是如何做的.如果你不提供对某个实例变量的公共访问(比如在你的情况下没有为它定义getter),只要对象的行为符合它,就不需要对象之外的人关心它的状态.在你的情况下,可能最好测试结果,而不是设置一些实例变量的事实. (14认同)
  • 你的解释非常感激,现在用不同的视角看待它,我不知道为什么我之前没有注意到,显然我需要重构它以便实例变量不需要设置来证明方法有效.再次感谢. (2认同)