2014-12-17 4 views
0

현재 프로젝트의 이미 작성된 코드에 대한 rspec 테스트를 작성하고 있습니다. 내가 테스트를 시도하고 코드는 다음과 같이이다 :컨트롤을 생성하는 메서드에 대한 Rspec 테스트

def foo (ip, user) 
    #[...] 
    result = "" 
    Net::SSH.start(ip, user) do |session| 
     result = session.exec!('some_command_in_linux') 
    end 
    #[...] 
end 

내가 효과적으로에 가짜 문자열을 할당 SSH을 통해 원격 명령의 실행에서 결과의 할당을 분리됩니다 달성하기 위해 노력하고 결과 변수.

수확량 계산자을 읽었지만 시나리오에 적용하지 못했습니다.

expect {|block| Net::SSH::start(ip, user, &block).to receive(ip, user, &block).and_return(sample_output)} 

어떤 아이디어 :

은보다 구체적으로는, 내가 좋아하는 뭔가를 생각?

+0

테스트를 분리하는 테스트 double을 사용하여 – phoet

답변

0

블록을 실제로 실행하지 않으려면을 실행하십시오. 간단히 무시하십시오. 그것은 실행되지 않습니다,하지만 무시해도 될 것이다 : 당신이 경우

expect(Net::SSH).to receive(:start).with(ip, user).and_return(sample_output) 

이 블록이 실행하려면, 사용 and_yield :

session = double(:session).as_null_object 
expect(Net::SSH).to receive(:start).with(ip, user).and_yield(session).and_return(sample_output) 

당신이 session 객체에서 작동하려면 어떤 방법으로, 당신은 할 수 expect 물건을 할 :

session = double(:session) 
expect(Net::SSH).to receive(:start).with(ip, user).and_yield(session) 
expect(session).to receive(:exec!).with('some_command_in_linux').and_return(sample_output) 
+0

굉장! 나는 블록을 인수로 전달한다는 측면에서 훨씬 더 복잡한 것으로 무언가를 놓쳤다 고 생각합니다. 실제로 블록을 예상치에 인수로 전달해야합니까? – stevelaskaridis

+0

블록을 기대치대로 넘길 수는 없습니다. –

+0

좋습니다. 도움을 다시 주셔서 감사합니다 ... – stevelaskaridis

관련 문제