2012-10-18 3 views
1

Mocha을 간단한 코드로 사용하면 예상치 못한 방식으로 바뀌 었습니다. 무엇이 잘못되었는지 설명해 주시겠습니까?모카 : 왜 #caller 메서드를 스텁하지 못합니까?

A.new.m #=> "(irb):32:in `irb_binding'" (for example) 

을하지만 caller 전화를 스텁하려는 경우, 일이 잘못되어 가고 :

require 'test-unit' 
require 'mocha' 

class A 
    def m 
    caller.first 
    end 
end 

그래서이 간단한 클래스를 사용하여, 우리는 최신 발신자를 얻을 수 있습니다.

a = A.new 
a.stubs(:caller) 

Mocha::ExpectationError: unexpected invocation: #<A:0x6aac20>.caller() 

내 생각 엔 Mocha 소스를 확인하는 것입니다,하지만 난 나중에 할 것)


  • 루비 1.9.3p194
  • 시험 장치 2.5.0, 2.4.8을
  • 모카 0.12.6

답변

1

이것은 부분이고 설명하지만 나는 여전히 유용하길 바란다.

당신이 제안했듯이, 여기에서 무슨 일이 벌어지고 있는지 이해하는 방법은 모카 소스를 확인하는 것입니다. 문제의 핵심은 클래스이며 스텁을 만들 때 사용됩니다. makes use of the caller method itself입니다. 예 : alias_method

class A 
    alias_method :my_caller, :caller # allow caller to be stubbed 

    def m 
    my_caller.first 
    end 
end 

a = A.new 
a.stubs(:my_caller) 
+0

감사합니다. 참고로, 기본적으로'모카 '에'호출자'를 지금 스터 빙할 방법이 없습니다 .. –

+0

그런 식으로 보입니다. 나는 모카가 스텁 (a : : 메서드)와 같은 것보다 더 멋진 스타일 인'a.stubs (: 메서드)'를 사용하기를 원한다는 것의 결과라고 생각합니다. 이것은 스텁을 설정하는 코드가 실행되는 것을 의미합니다. 객체의 컨텍스트 따라서 스텁 작성 프로세스에 사용 된 모든 메소드를 실제로 시도해도 객체의 스텁이 발생하기를 원할지라도이 문제를 일으킬 수 있습니다. 분명히, 선택된 모카 구문은 전반적으로 더 좋으며, 이와 같은 엣지 경우에는 문제가 발생합니다. – mikej

+0

나를 위해 문제가있는 것 같습니다. 'Kernel'이'Object'에 포함되어 있기 때문에'Mocha'는'Kernel'에서'caller'를 호출하거나 다소 좋아할 수 있습니다. –

0

m입니다. 따라서 caller.first은 항상 쓸모가없는 m을 호출하는 라인이됩니다. 아마도 당신이 원하는 것은 caller.first (또는 caller[0])이 아닌 caller[1] 일 것입니다.

+0

기본적으로 아니요. 그 아이디어는 "호출자 (caller)"를 스텁 (stub)하는 능력에있었습니다. 어쨌든, 관심을 가져 주셔서 감사합니다. –

관련 문제