我需要模拟一个长响应时间。我的Moockjax正在运行 - 它提供了正确的模拟数据。但是我的ajax调用是在第二次加载页面时完成的,即使我将responseTime设置为20秒。
你知道吗?我将测试页面减少到最低限度,以排除其他潜在的错误来源:
<!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秒内给出了这个输出:
我还写了一篇关于它的博客文章here。
答案 0 :(得分:2)
Mockjax目前无法阻止延迟。请参阅current code:
if ( requestSettings.async === false ) {
// TODO: Blocking delay
process();
} else {
this.responseTimer = setTimeout(process, parseResponseTimeOpt(mockHandler.responseTime) || 50);
}
您需要指定async: true
才能生效。当你这样做时,你需要在casper上下文中等待,因为控制流将继续而不等待结果。
casper.start(url, yourEvaluateFunction).wait(25000).run();
我不认为,除了以某种方式做忙碌之外,JavaScript甚至可以实现阻塞延迟。但是在这段时间里,其他一切都会停滞不前(JavaScript是单线程的),而你却无法从繁忙的地方获得任何东西。
答案 1 :(得分:1)
responseTime
,因为在代码执行方面确实没有理由(也就是说,ajax请求在任何情况下都不会异步,那么为什么会出现延迟?) 。也就是说,您可以实现response
函数(而不是使用responseText
),然后使用简单的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或更高版本才能获得此功能!