如何针对 mysqli 准备好的语句编写 PHP 单元测试?

问题描述 投票:0回答:1

我想针对类函数编写 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);
    }

错误报告连接数据库失败。当这个测试运行时,数据库将不可用,所以我需要模拟某些东西。

有什么问题会跳出来吗?

php mysqli phpunit
1个回答
0
投票

既然

$this->c
是您想要模拟测试的内容,那么更新
LoginFormClass
的构造函数以使其接受连接对象怎么样?这应该会简化您的测试。

在实际的应用程序逻辑中,您可以使用一些依赖注入库(例如PHP-DI)来帮助构建对象。

© www.soinside.com 2019 - 2024. All rights reserved.