2010-02-23 6 views
0

RSpec에서 mocking과 stubbing을 위해 RR을 사용하고 있으며, 일부 인스턴스 변수를 설정하는 컨트롤러의 수퍼 클래스에서 메소드를 스터브하고 싶습니다. 메서드 호출을 스텁하는 법을 배울 수 있습니다. 디버깅 할 경우 스텁 블록이 호출되었음을 알 수 있지만 블록의 인스턴스 변수를 테스트 할 클래스로 전파 할 수 없습니다.레일스의 수퍼 클래스에서 before_filter를 스텁하는 방법은 무엇입니까?

그냥 무너 뜨리는 :

기본 설정, 그리고 그럼 컨트롤러 B 내 테스트에서 내가 뭔가에 @instancevar 설정하기에서 bogglesnap 방법을 스텁 싶습니다
class A < ApplicationController 
    before_filter :bogglesnap 

    def bogglesnap 
    @instancevar = "totally boggled" 
    end 
end 

class B < A 
    def do_something_with_instance 
    if @instancevar 
     .... 
    else 
     .... 
    end 
    end 
end 

I 필요. 나는 그것을하는 방법을 알아낼 수 없다. 내가 RR의 instance_of의 스터 빙을 시도하고 단지 컨트롤러 정의 밖으로 스텁 한

:

stub.instance_of(A).bogglensap { @instancevar = "known value" } 
stub(controller).bogglesnap { @instancevar = "known value" } 

그러나이 중 어느 것도 제대로 작동을 잘, 그들은 작동하지 않습니다 :)

사람이 있습니까 해당 메서드를 스텁하고 인스턴스 변수를 설정하는 방법에 대한 모든 포인터가 있습니까? 블록이 실행되는 컨텍스트와 관련이 있다고 가정하고 있지만 다른 사람이 이전에 이런 식으로 실행되기를 기대하고 있습니다.

감사

당신이 이제까지의 값을 가져 오기 위해 원하는 경우, 객체 인스턴스에서 호출하여 instance_variable_set 방법을 사용하여 유사하므로

controller.instance_variable_set("@instancevar", "known value") 

처럼, 당신이 원하는대로로 설정할 수 있습니다

답변

2

귀하의 사양이나 디버그 또는 클래스 외부에서 다른 일을 할 수있는 인스턴스 변수는 당신은을

controller.instance_variable_get("@instancevar") 

마음을 수행하여 값을 얻을 수 있습니다및 instance_variable_get 메서드는 컨트롤러뿐만 아니라 루비가 제공하는 모든 개체에서 사용할 수 있습니다. 사실,이 두 가지 방법은 레일 마법에서 중요한 역할을합니다.

+0

저는 인스턴스 변수와 동적 프로그래밍 루비가 제공하는 것을 알았습니다. 사용하는 것을 생각하지 않았습니다 ... 두뇌 자극에 감사드립니다! :) 방금 ​​시도해보고 작동하는지 확인했습니다. – ozzyaaron

관련 문제