Ruby Rspec: тестирование переменных экземпляра без добавления метода доступа к источнику - PullRequest
70 голосов
/ 20 февраля 2012

Я пытаюсь проверить следующий метод:

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

, где я хочу установить состояние для @multi_move, но я не хочу добавлять средство доступа только для тестирования.Есть ли способ сделать это без доступа?Спасибо.

1 Ответ

121 голосов
/ 20 февраля 2012

Вы можете использовать метод 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

И Object#instance_variable_set могут использоваться для установки значений переменных экземпляра:

foo.instance_variable_set(:@foo, 12) 
puts foo.instance_variable_get(:@foo)
#=> 12
...