Ruby Rspec : 소스에 접근자를 추가하지 않고 인스턴스 변수 테스트


79

다음 방법을 테스트하려고합니다.

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의 상태를 설정하고 싶지만 테스트를 위해 접근자를 추가하고 싶지는 않습니다. 접근 자없이 그렇게 할 수있는 방법이 있습니까? 감사.

답변:


131

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

하지만 테스트 내에서 미리 설정해야합니다. 내가 테스트하기 전에는 가치가 없습니다.
steve_gallagher 2012

1
@steve_gallagher, 문서를 살펴보십시오. 이 instance_variable_set바로 옆에 instance_variable_get(대답에 문서에 추가 된 예와 링크).
KL-7

1
흥미 롭군. 나는 당신이 바로 들어가서 그런 인스턴스 변수를 설정하고 얻을 수 있다는 것을 몰랐습니다. 그래도 RSpec 테스트를 많이 보았고 그 메서드가 호출되는 것을 본 적이 없습니다. 꽤 전형적인 상황이라고 생각되는 것을 처리하는 비표준적인 방법처럼 보입니다. 나는 불평하지 않습니다. 대답 해 주셔서 감사합니다.
steve_gallagher

17
@steve_gallagher, 전에 보지 못한 이유는 객체의 개인 상태가 대부분의 경우 테스트해야하는 것이 아니기 때문이라고 생각합니다. 어떤 개체의 동작과 논리를 테스트하려는 경우에는 어떤 기능을하는지 테스트해야하지만 어떻게하는지 테스트해야합니다. 일부 인스턴스 변수에 대한 공개 액세스를 제공하지 않는 경우 (예 : 귀하의 경우에 getter를 정의하지 않음) 객체가 제대로 작동하는 한 객체 외부의 누군가가 상태를 신경 쓸 필요가 없습니다. 귀하의 경우에는 일부 인스턴스 변수가 설정되었다는 사실보다 결과를 테스트하는 것이 더 낫습니다.
KL-7

2
귀하의 설명은 매우 감사합니다. 지금 다른 관점으로 살펴보면, 이전에 왜 알아 차리지 못했는지 모르겠습니다. 분명히 인스턴스 변수가이를 증명하기 위해 설정할 필요가 없도록 리팩토링해야합니다. 방법이 작동합니다. 다시 한 번 감사합니다.
steve_gallagher 2012
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.