2012-01-18 2 views
4
class A 
    include Logging 
    log_to 'whatever' 
end 

올바른 매개 변수로 log_to 메서드가 호출되는지 테스트하고 싶습니다. 그러나 짐작할 수 있듯이 log_to 메서드는 로깅 모듈에서 제공되며 클래스가로드 될 때 호출됩니다. log_to 'whatever'이 호출되는지 확인하기 위해 스펙 또는 사용자 정의 정규합기를 작성하려면 어떻게해야합니까?클래스 load에서 호출되는 클래스 메서드에 대한 사양을 작성하는 방법은 무엇입니까?

class Alog_to 메서드를 조롱했다해도 클래스로드 중에 호출 될 때 호출되는지 확인할 수있는 방법이 없습니다. 내가 상수를 제거하고 다시 작동하지 않는 것 로딩 했어요. 생각?

답변

3

이것은 아마도 클래스 A의 기능의 대부분을 테스트 사양 파일에서 별도의 스펙 파일에 있어야합니다 : 나는 테스트하기 쉽게 뭔가 클래스의 동작을 변경하지만, 고려할 것

describe 'A' do 

    it 'should log when loaded' do 
    class A ; end 
    A.should_receive(:log_to).with('whatever') 
    require 'a' 
    end 

end 

. 건설에 이상하거나 까다로운 제약이있는 테스트는 코드 냄새입니다.

+0

나는 당신과 동의하지만 클래스 로그를 다른 파일로 만드는 것은 이런 식으로하는 것이 의미가있다. 그렇지 않니? 그렇지 않다면 다른 방법을 제안 할 수 있습니까? – Chirantan

+0

@Chirantin, 생각해 보면, 당신 말이 맞아요. 나는 그것을 시험 할 다른 방법을 고안하려고 노력할 것이다. 나는 지금까지 내가 제안한 것에 너무 만족하지 않는다. –

1

구현 세부 사항이 아닌 원하는 결과를 테스트해야합니다. 나는이 같은 고립 로깅 모듈을 테스트하는 것입니다 :

describe Logging do 
    TEST_IO = StringIO.new 

    # some stub class for testing 
    class Person 
    include Logging 
    log_to TEST_IO 

    def name 
     "Bob" 
    end 
    end 

    after do 
    TEST_IO.reopen 
    end 

    it "logs a method call to the given io" do 
    person = Person.new 
    TEST_IO.string.should eq("") 
    person.name 
    TEST_IO.string.should eq("name called\n") 
    end 

    # ... 
end 

그리고 나는 그것을 아주 간단하고 위험한 논리를 포함 않기 때문에 모든이 모듈을 사용하는 실제 클래스를 테스트하는 것입니다 모르겠습니다. 구문 오류와 같은 우연한 실수는 통합 테스트에 의해 포착됩니다.

관련 문제