我想针对类函数编写 PHP 单元测试。
功能:
function ValidateToken(string $key, string $token): array {
if (!empty($key) || !empty($token)) {
$email = "%".htmlspecialchars($key)."%";
$token = htmlspecialchars($token);
$stmt = $this->c->prepare("SELECT expDate FROM `authuser` WHERE `reset_link_token`= ? AND `email1` LIKE ?");
$stmt->bind_param('ss',$token,$email);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_array(MYSQLI_ASSOC);
$curDate = date("Y-m-d H:i:s");
if ($result->num_rows > 0) {
if($row['expDate'] >= $curDate){
return array("response"=>1,"email"=>$key,"token"=>$token);
} else {
return array("response"=>2);
}
} else {
return array("response"=>0);
}
} else {
return array("response"=>0);
}
}
我想针对成功的、未过期的令牌运行测试。这是我的测试,不起作用:
public function testExpiredTokenSuccess() {
$successToken = new stdClass();
$successToken->expDate = '2099-12-31 23:59:59'; // y2.1k bug
$this->mockLF = array();
$this->mockLF[0] = $successToken ;
$this->dbMock = $this->getMockBuilder(Connection::class)
->disableOriginalConstructor()
->getMock();
$curDate = date("Y-m-d H:i:s");
$this->authuserloginclass = new LoginFormClass();
$returnVal = $this->authuserloginclass->ValidateToken('key','token');
$this->assertEquals("1", $returnVal);
}
错误报告连接数据库失败。当这个测试运行时,数据库将不可用,所以我需要模拟某些东西。
有什么问题会跳出来吗?
既然
$this->c
是您想要模拟测试的内容,那么更新 LoginFormClass
的构造函数以使其接受连接对象怎么样?这应该会简化您的测试。
在实际的应用程序逻辑中,您可以使用一些依赖注入库(例如PHP-DI)来帮助构建对象。