2017-02-28 6 views
0

나는 현재의 소셜 미디어 사이트에있는 "링크 미리보기"기능을 모방 한 React 구성 요소를 가지고 있습니다. 당신은 링크에 입력이Capybara로 테스트하는 동안 의도적으로 AJAX 응답을 지연시키는 방법은 무엇입니까?

enter image description here

나는 반작용 성분을 갖는하여이 작업을 수행 ... 등, 이미지, 제목을 가져 오는 AJAX와는 URL 미리보기 데이터를 가져 오기 위해 내 서버에 다시 전화합니다.

그것이 내가 중간 "로드"상태를 보여 가져 오는 것 동안 (즉,로드 아이콘이나 물레 일부)

this.setState({ isLoadingAttachment: true }) 

return $.ajax({ 
    type: "GET", 
    url: some_url, 
    dataType: "json", 
    contentType: "application/json", 
}).success(function(response){ 
    // Succesful! Do Success stuff 
    component.setState({ isLoadingAttachment: false }) 
}).error(function(response) { 
    // Uh oh! Handle failure stuff 
    component.setState({ isLoadingAttachment: false }) 
}); 

주처럼 isLoadingAttachment 상태 변수에만 유효

관련이 조각이 보이는 반작용 방법 잠시 동안 서버가 페칭을 수행하는 동안. 성공 및 오류 시나리오 모두 즉시이를 비활성화합니다.

내 Capybara 기능 사양으로 "로드 중"상태에서 일부 기능을 테스트하고 싶습니다. 모든 웹 호출과 서버에서 반환 할 데이터를 조롱했습니다. 그러나 모든 결과가 너무 빨리 발생하기 때문에 어떤 로딩을 수행하기도 전에 어떤 expect().. 문도 실행할 수 있습니다. 또한 의도적으로 wait_for_ajax을 호출하지 않아 페이지가 아약스를 기다리지 않고 계속 진행될 수 있지만 너무 빠릅니다.

마지막으로 서버 호출을 의도적으로 1.0 초 지연했지만 그 중 하나가 작동하지 않았습니다. 나는 모든 것이 어떻게 든 하나의 스레드로되어 있기 때문에 추측합니까?

# `foo` is an arbitrary method called during the server-side execution 
allow_any_instance_of(MyController). 
    to receive(:foo) { sleep(1.0) }.and_call_original 

내가 어떻게 할 수 있습니까?

감사합니다!

답변

2

Capybara는 테스트와 다른 스레드에서 응용 프로그램 서버를 시작하지만 기본 Capybara.server 설정을 사용하는 경우 기본적으로 webrick을 사용하므로 앱을 다시 호출 할 때 문제가 발생할 수 있습니다. 대신 Capybara.server = :puma을 지정해야합니다. 그 외에도 조롱 응답은 일반적으로 기능 사양 (일반적으로 엔드 - 투 - 엔드 테스트 임)에서 나쁜 아이디어입니다. 이는 실제로 앱 코드를 프로덕션 환경에서 실행하는 방식으로 테스트하지 않는다는 것을 의미하기 때문입니다. 당신이

proxy.stub('https://example.com/proc/').and_return(Proc.new { |params, headers, body| 
    sleep 2 
    { :text => "Your results"} 
}) 
+0

감사 같은 것을 할 수 있도록 것이다 당신의 응용 프로그램 코드의 외부 모의 웹 응답에 - https://github.com/oesmith/puffing-billy - 더 나은 솔루션 puffing-billy 같은 것을 사용하는 것입니다! 다른 하나의 후속 조치 - '퓨마'가 여기 webrick보다 서버에 더 좋은 선택이되는 이유는 무엇입니까? 나는 그들이 같은 종류의 응답을 생성하기 때문에 서버가 무의미하다고 생각했을 것이다. – user2490003

+0

@ user2490003'puma'는 기본적으로 다중 스레드이며 여러 요청을 동시에 처리 할 것입니다 (동일한 요청을 다시 한 번 앱에 요청하는 것과 같습니다)) - 99 %는 프로덕션에서 webrick을 사용하지 않고 있는지도 모릅니다. 아마도 푸마를 사용하고 있습니까? 가능한 한 테스트 env를 제작물과 일치시키는 것이 가장 좋습니다. –

+0

당신은 정확합니다, 나는 프로덕션에서 퓨마를 사용하고 있습니다. 설명 주셔서 감사합니다! – user2490003