如何测试Ajax FAIL处理程序

时间:2019-01-12 14:25:57

标签: php ajax

我正在使用新的Ajax调用处理程序重写一些旧的JS / php函数。
“完成”和“始终”都可以;他们做了预期的事情。
问题(可能很愚蠢,对不起):如何测试“失败”部分?或者,以不同的方式询问何时激活此处理程序?
这是用于测试的JS函数:

$("#btn1").on('click',function(event)  {
	var ob=[];

  $.get({
      url: "php/test.php?code=5",
		}).done(function (data, status, jqXHR) {
		     	var response = JSON.parse(data);
		     	var id=response[0];     		
		 			ob = response[1];	
		}).fail(function (jqXHR,status,err) {
		  	alert("Error in function");
		}).always(function () {
      	alert ("Done!");  		
		})
});

这是所谓的PHP函数:

<?php
$host = "localhost";
$username = "me";
$password = "mypass";
$db_name = "invalid";	//not existing DB
$code= $_GET['code'];

// Create connection
$db = new mysqli($host, $username, $password,$db_name); 	//here the error
$query = "SELECT * FROM Table WHERE Code='".$code."'";
$result = mysqli_query($db,$query);
$row = mysqli_fetch_array($result);
$id  = $row[ID];

$list = [
    "Name" => "John",
    "Surname" => "Smith"
];

$res = array($id, $list);
echo json_encode($res);
?>

您会看到由于凭据错误而无法执行数据库访问,因此我希望收到一些错误,并被“失败”拦截
这不会发生,并且我得到一个null(ID)和列表。

我是否误解了“失败”的含义?

2 个答案:

答案 0 :(得分:1)

您应该返回一个合适的HTTP code。您可以使用http_response_code

$db = new mysqli($host, $username, $password, $db_name);

if ($mysqli->connect_error) {
  http_response_code(401);
  die;
}

任何非200错误代码都应导致触发失败处理程序。

如果您想捕获代码可能产生的任何错误,可以使用set_error_handlerset_exception_handler

set_error_handler(function (int $errno , string $errstr, string $errfile, int $errline, array $errcontext) {
  // Log error...
  http_response_code(500);
});

set_exception_handler(function (\Exception $exception) {
  // Log error...
  http_response_code(500);
});

我在示例中使用了500(内部服务器错误)代码,但是您可以根据所得到的错误/异常来计算更合适的错误代码。

答案 1 :(得分:0)

当您的服务器响应http代码不是200(例如500服务器错误或运行时异常)时,将触发失败。

要测试失败的情况,您可以简单地抛出一些异常并将其处理掉。

或者更复杂的选择可能是提琴手,它是一个调试代理,您可以覆盖对所需内容的响应。