2013-10-04 1 views
1

RSpec에 예 글로벌 로깅 기능을 스텁 : 내 테스트에서 그러나가 어떻게 글로벌 정적 로깅 클래스에 기록 일부 코드, 예를 들어, 함께 일하고

GlobalLog.debug("Some message") 

, 나는를 포함하지 않을 실제 로그는 많은 원치 않는 종속성을 초래하기 때문입니다. 그래서 나는 그것을 조롱하려는 : 복식은 각각의 예 후에 지워집니다 때문에

describe "some function" do 
    before(:all) do 
    log = double('log') 
    GlobalLog = log 
    log.stub(:debug) 
    end 
    ... 
end 

불행하게도,이 허용되지 않습니다

https://www.relishapp.com/rspec/rspec-mocks/docs/scope

나는 before(:all)before(:each)의로 변경하는 경우 코드가 작동하지만 경고 메시지가 나타납니다.

warning: already initialized constant GlobalLog 

이렇게하면 테스트 결과가 막히고 있습니다. 경고. 깨끗한 솔루션이 있습니까?

답변

3

spec_helper.rbGlobalLog을 한 번 정의하십시오.

class GlobalLog 
    class << self 
    [:info, :debug, :warn, :error].each do |method| 
     define_method(method) {|*|} 
    end 
    end 
end 

당신이 그것에 관하여 더 청결하게하고 싶은 경우에 spec/support에서 던질 수 있었다.

+0

나는'define_method (method) {| * args |}'와 같이 인자를 취해야한다. – Stefan

+0

감사합니다. 수정 사항을 추가했습니다. – davogones

1

왜 원본을 스터브하지 않습니까? GlobalLog 개체 방법은 무엇입니까?

before(:each) 
    GlobalLog.stub(:debug) 
end 
+0

나는'NameError : 초기화되지 않은 상수 GlobalLog'를 얻었 기 때문에 – Stefan

+0

'GlobalLog' 클래스는 어디에 정의 되었습니까? –

+0

나는 잘 모르겠다. 나는 특별히 알고 싶지 않다 :-). 내가 지금 쓰고있는 테스트와 관련이 없기 때문에, 신경 쓰고 싶지 않은 코드에 묻혀있는 의존성입니다. 그래서 내가 그걸 그냥 뽑기를 바랐다. – Stefan