2016-12-31 1 views
1

내 프로그램이 웹에서 zip 파일을 다운로드 한 다음 파싱합니다. 관련 분석 관련 코드는 다음과 같습니다RSpec mock/stub에서 다른 매개 변수 값을 사용하는 방법은 무엇입니까?

내 RSpec에 테스트 환경에서
Zip::File.open("real_file.zip") do |zip_file| 
    # do stuff 
end 

, 내가 대신 진짜의 가짜/모의 파일을 구문 분석이 코드를 스텁 싶습니다. 특히, 매개 변수 값 "real_file.zip"을 "mock_file.zip"으로 바꾸고 싶습니다.

나는 다음과 같은 접근 시도 :

allow(Zip::File).to receive(:open).and_return(Zip::File.open("mock_file.zip")) 

을 ... 그러나 이것은 블록 (# do stuff) 내부 코드의 실행을 방지 할 수 있습니다. 모의 파일 내용이 이 되려면이 반환되지만 나중에 사용하려면 zip_file 값을 할당해야합니다. 어떻게이 일을 성취 할 수 있습니까? 당신이 여기서하고있는 것은 원래의 코드 블록에 값을 산출한다

mock_file = Zip::File.open('mock_file.zip') 
allow(Zip::File).to receive(:open) { |&block| block.call(mock_file) } 

:

+0

난 당신이 (우편 :: 파일) 수'싶은 생각은받을 .TO block.call (Zip :: File.open ('mock_file.zip'))}' https://www.relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/ 블록 구현 # 호출자의 블록 – mroach

답변

1

여기 당신이 원하는거야. 스칼라 값을 반환하는 문제는 블록에 아무 것도주지 않으므로 호출되지 않는다는 것입니다. 참고 메시지 예상을 넣기 전에 모의 파일을 여는 중이므로 Zip::File.open에 대한 호출을 가로 채고 멋진 스택 오버플로가 발생할 수 있습니다. | 및 블록 | {

는 는

더 많은 정보 : (개방) https://www.relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/block-implementation#yield-to-the-caller 's의 블록

+0

성공! 이 전략을 일찍 접했지만 문서 예제를 내 응용 프로그램에 맞게 번역하는 방법을 찾지 못했습니다. 고마워요. @mroach – s2t2

관련 문제