2013-08-26 3 views
0

저는 Capybara와 Poltergeist를 사용하여 setTimeout을 사용하여 정기적으로 페이지 내용을 새로 고치는 색인 페이지를 테스트하고 있습니다. 페이지 내용은 외부 서비스를 기반으로 세 가지 상태 사이를 전환하며 각 상태에 대해 카세트가 있습니다.여러 VCR 카세트를 사용하여 자바 스크립트를 새로 고칩니다.

VCR.use_cassette 'object_new' do 
    visit index_path 
    page.should have_content 'New' 
end 

VCR.use_cassette 'object_running' do 
    page.should have_content 'Running' 
end 

VCR.use_cassette 'object_complete' do 
    page.should have_content 'Complete' 
end 

첫 번째 have_content는 성공하지만 두 번째는하지 않습니다 :

나는 다음과 같은 코드를 사용하여 새로 고침을 테스트하기 위해 노력하고있어. Capybara는 이러한 어설 션이 통과하도록 DOM을 반환하고 업데이트하는 비동기 호출을 기다려야합니다. 나는 아약스 호출이 돌아 오면 기다려야 주장을 강제로 using_wait_time을 시도했지만, 그것은 도움이되지 않습니다. 이 작품을 만들기 위해 제 스펙에서 누락 된 부분에 대한 아이디어는 있습니까? 이 기능은 브라우저에서 작동합니다. 그냥 지나치지 않는 테스트 일뿐입니다.

답변

0

실제로 초기 구현은 정확하지만 내 JS는 서버 오류를 처리 할만큼 충분히 복원력이 없습니다. 요청은 카세트 재로드 사이에서 해고되고 성공하지 못한 HTTP 상태를 리턴합니다.

오류가있는 요청을 처리하고 폴링을 계속하기 위해 JS를 업데이트하면 결국이 문제가 해결되고 JS는 어쨌든 작동해야합니다. 외부 서비스에

2

poltergeist 드라이버를 사용하여 테스트를 실행하면 페이지가 실제로는 별도의 프로세스 (예 : phantomjs 프로세스)로 렌더링됩니다.

이것은 VCR이 테스트를 실행하는 Ruby 프로세스 내에서 만들어진 HTTP 호출에만 영향을 미치기 때문에 자바 스크립트가 외부 콘텐츠를로드하는 경우 PhantomJS가 VCR 카세트를로드하는 대신 실제로 외부 콘텐츠를로드한다는 것을 의미합니다.

Capybara로 JS 코드를 테스트하는 대신 JS를 외부 서비스에 대한 호출을 조롱 할 수있는 Jasmine과 같은 것으로 테스트 해보십시오.

+0

호출은 레일 앱에서 이루어지고, 상기 JS는 편안한 API에 액세스한다. 전체 스택을 테스트하고 싶습니다. 따라서 Rails 응용 프로그램의 API를 사용하고 VCR을 사용하여 백엔드에서 서비스를 조롱합니다. 그게 문제가있는 곳입니다. JS는 사양에 따라 API를 호출 할 때,합니다 (JS가 실행중인 내 레일 응용 프로그램의 테스트 버전을 호출하기 때문에)이 변경된 카세트가 있어야하지만, 난 여전히 처음 카세트가로드 된 경우와 같은 반응을 얻고있다. – jmacdonald

+0

은 어떻게 관장 공동 AJAX를하는 카세트의 변화와 JS 코드에서 호출입니까? AJAX 호출은 카세트를 변경하기 전이나 후에 별도의 프로세스에서 발생하기 때문에 발생할 수 있습니다. 요청이 이루어질 때를보기 위해 카세트 변경 및 제어기에 시간 소인 기록을 추가하는 것이 좋습니다. – lmars

+1

AJAX 응답을 보면 500 오류가보고되어 테스트가 실패한 것입니다. 테스트 로그를 보면 다른 세부 정보는 표시되지 않습니다. AJAX 비트는 매 5 초마다 재 시도를 계속하므로 첫 번째 시도에서 올바른 응답을 찾지 못해도 결국 결과가 나타납니다. 카세트없이 요청을하면 VCR은 대개 매우 보컬이기 때문에 카세트 전환이 오류의 원인이라고 생각하지 않습니다. 첫 번째 페이지는 주장의 가치가있는 것입니다. – jmacdonald