2014-11-25 7 views
1

긴 responseTime을 시뮬레이트해야합니다. My Moockjax가 작동 중입니다. 올바른 모의 데이터를 제공합니다. 하지만 내 AJAX 호출은 20 초 응답 시간을 설정하더라도 두 번째 페이지에서로드됩니다.Mockjax에서 responseTime이 작동하지 않습니다.

아이디어가 있으십니까?

는 여기 오류의 다른 잠재적 인 원인을 제거하기 위해 최소한으로 테스트 페이지를 감소 :

<!DOCTYPE HTML> 
<html> 
<head> 
    <script src="jquery.js"></script> 
    <script src="../jquery.mockjax.js"></script> 
    <title>MockJax Tests</title> 
    </head> 
<body> 
    <h1>A MockJax test.</h1> 
    <p>Take a look into the console.</p> 
    <script> 

     $.mockjax({ 
      url: "foo.html", 
      responseTime: 20000, 
      responseText: "Hi! I am mockjax." 
     }); 

     $.ajax({ 
      async: false, 
      url: 'foo.html', 
      success:function(data){ 
      console.log(data); 
      }, 
      error:function(data){ 
      console.log('It doesn’t work that way :('); 
      } 
     }); 

    </script> 
</body> 
</html> 

는 또한 CasperJS 및 Mockjax (casper.evaluate의 내부)과 테스트를 썼다. 그것은 거기에 동일합니다.

여기 내 CasperJS 코드

var casper = require("casper").create({ 
    verbose: true, 
    logLevel: 'error', 
    clientScripts: ["node_modules/jquery-mockjax/jquery.mockjax.js"] 
}); 

casper.on('remote.message', function(msg) { 
    this.echo('remote message caught: ' + msg); 
}) 

casper.start('http://der-zyklop.de/', function() { 
    this.evaluate(function() { 

    $.mockjax({ 
     url: "/blog/feed", 
     responseTime: 20000, 
     responseText: "Hi! I am mockjax!" 
    }); 

    $.ajax({ 
     async: false, 
     url: '/blog/feed', 
     success:function(data){ 
     console.log(data); 
     }, 
     error:function(data){ 
     console.log('It doesn’t work that way :('); 
     } 
    }); 

    }); 
}); 

casper.run(); 

당신이 CasperJS가 설치되어있는 경우, 당신은 npm install jquery-mockjax 다음 casperjs test.js하여 실행할 수 있어야합니다. 그것은 나에게 20에서 초이 출력을 제공합니다

mockjax output

나는 또한 here에 대해 blogarticle을 썼다.

+1

어떤 jQuery 버전을 사용하고 있습니까? 2.x를 사용하는 경우 1.x로 다운 그레이드를 시도 할 수 있습니다 –

+0

힌트를 보내 주셔서 감사합니다. 1.11.1 및 2.1.1에서 지금 사용해 보았습니다. 불행히도 아무것도 바뀌지 않습니다. – DerZyklop

+0

@ArtjomB. 확실한. 문제 없어. 내 CasperJS 테스트 파일의 내용을 추가했습니다. – DerZyklop

답변

2

Mockjax는 현재 차단 지연을 수행 할 수 없습니다. 참조 current code :

if (requestSettings.async === false) { 
    // TODO: Blocking delay 
    process(); 
} else { 
    this.responseTimer = setTimeout(process, parseResponseTimeOpt(mockHandler.responseTime) || 50); 
} 

당신이 작동하지 async: true를 지정해야합니다. 그렇게 할 때, 결과를 기다리지 않고 제어 흐름이 계속되기 때문에 캐스퍼 컨텍스트에서 대기해야합니다.

블라인드를 수행하는 것 외에도 JavaScript로 블로킹 지연이 발생할 수도 있습니다. 그러나이 시간 동안 다른 모든 것들도 여전히 존재할 것입니다 (자바 스크립트는 단일 스레드입니다) 그리고 당신은 busywait에서 아무것도 얻지 못할 것입니다.

+0

그래, 그 TODO 거기에 오랜 시간왔다. 전에 코드를 인수했습니다. 솔직히, 나는 그것이 대안을 제시 할 필요가 없다고 생각하지만, 나는 그것에 대해 공개적이다. – jakerella

+0

답변에 대한 토론을 계속하겠습니다. –

1

그래, @ artjom-b가 맞습니다. 우리는 코드 실행의 측면에서 실제로 이유가 없기 때문에 비동기 요청에 responseTime을 구현하지 않았습니다. 즉, 어떤 경우에도 ajax 요청이 비동기 적이 지 않으므로 지연이 발생하지 않습니다. 즉, (대신 responseText를 사용)를 response 기능을 구현하고 간단한에서는 setTimeout() 및 우리의 새로운 async response functionality를 사용하여 지연을 강제 할 수 말했다

$.mockjax({ 
    url: 'foo.html', 
    response: function(settings, done) { // the "done" argument makes this async 
    var self = this; 
    setTimeout(function(){ 
     self.responseText = "Hi! I am mockjax."; 
     done(); // this ends the async action 
    }, 20000); // here is your 20 second delay 
    } 
}); 

참고 : Mockjax 1.6을 사용해야합니다. 0 이상이 기능을 얻으려면!

+0

Mockjax의 최신 버전을 사용하고 있습니까? 이것은 v1.6.0에서 처음 소개되었지만 아직까지 나오지 않았습니다.비동기 기능이 작동합니다 (우리 자신의 테스트와 코드 모두에서). – jakerella

+0

;) 걱정하지 마라. .. 그 새로운 특징! – jakerella