2012-05-07 2 views
1

면책 조항 : 일반적으로 RSpec 및 TDD를 처음 사용하므로 완전히 잘못된 방식으로 진행될 수 있습니다.RSpec 함수에서 초기화 된 객체에 대해 any_instance 스텁 (stubbing)

내 프로그램에 명령을 입력하고이를 처리 할 클래스를 생성하는 명령 행 인터페이스를 작성하고 싶습니다. 프로그램이 작동하도록 의도 된 방법은 git 및 svn과 같은 도구와 유사합니다. 즉 "srs init"을 사용하여 프로그램을 초기화하고 "srs add"를 사용하여 프로그램에 무언가를 추가 할 수 있습니다.

그래서 나는 ARGV를 받아 다음과 같습니다 특정 핸들러에를 전달하는 클래스가 :

다음과 같을 것이다
class CLI 
    def run!(*arguments) 
     command = arguments.shift 
     case command 
     when "init" 
      CLI::Init.new.run!(*arguments) 
     end 
    end 
end 

내 초기화 핸들러 :

class CLI 
    class Init 
     def initialize() 
     end 
     def run!(*arguments) 
     end 
    end 
end 

I CLI 클래스의 라우팅 기능을위한 테스트 슈트를 작성하려고합니다. 나는 다음과 같은 사용하는 경우 RSpec에 실패 :

내가 초기화 핸들러의 실행에 직접 호출 CLI::run!에 전화를 교체 할 경우 통과 그러나
describe CLI do 
    it "should launch the Init handler if we pass init" do 
     CLI::Init.any_instance.should_receive(:run!) 
     CLI::run!(*["init"]) 
    end 
end 

; any_instance 만 describe 블록 내에서 구성 정의 인스턴스/작동,하지만 난 정말 모르겠어요 것처럼 i.e.:-

describe CLI do 
    it "should launch the Init handler if we pass init" do 
     CLI::Init.any_instance.should_receive(:run!) 
     CLI::Init.new.run!(*[]) 
    end 
end 

것 같습니다. 누구든지 나에게 내 run! 함수 내에서 구축 된 인스턴스에서 클래스 메서드가 호출되었는지 또는 처음부터이 기능을 테스트하는 더 좋은 방법으로 호출되었는지 확인할 수있는 방법에 대한 지침을 제공 할 수 있다면 가장 좋습니다.

+0

어떻게 실패합니까? 추적을 보여줄 수 있습니까? 언뜻보기에는 코드가 괜찮아 보입니다. – x1a4

+1

@ x1a4 님, 귀하의 의견을 읽은 후 다시 한 번 보았습니다. 나는이 게시물에 대한 코드를 단순화했고, 단순화 된 코드는 정상적으로 작동한다. 게시하기 전에 같은 방식으로 실패했는지 테스트해야했다. 8 시간 한도가 만료되면 문제가 무엇인지 설명하는 답변을 게시합니다. – danielpwright

답변

0

간혹 문제를 설명하면 대답이 나타납니다. 내가 질문을 단순화하기 위해 루프를 꺼내서 문제를 설명에서

%w{Init}.each do |cmd| 
    describe CLI do 
     it "should launch the #{cmd} handler if we pass #{cmd}" do 
      CLI.const_get(cmd).any_instance.should_receive(:run!) 
      CLI::run!(*[cmd]) 
     end 
    end 
end 

을 :하지만, 실제 사실, 핸들러의 이름은, "초기화"더이처럼 describe 블록에 매개 변수로 전달되고 있었다 이 과정에서 중요한 변화가 생겼습니다. 초기화의 이름은 init "i"로 시작하는 반면, 명령 줄 init에 전달되는 명령의 이름은 작은 "i"로 시작합니다.

"init"명령을 전달해야 할 때 "Init"명령을 전달하려고 했으므로 테스트가 올바르게 실패한 것으로 판명되었습니다.

TL; DR - 원본 코드 이 실제로 작동합니다. 귀찮게해서 미안해.

관련 문제