PHPUnit对于相同的代码具有不同的行为

时间:2014-02-14 16:48:10

标签: php phpunit behavior

我正在为我编写的mysqli包装器类编写单元测试。

其中一项测试是使用错误的凭据检查连接到MySQL。

这是课程'c'tor代码:

public function __construct($host, $userName, $password, $databaseName)
{
    $this->m_sqlConn = new mysqli($host, $userName, $password, $databaseName);
    if( !mysqli_connect_error() )
    {
            //...
    }
    else
    {
        throw new FailedToConnectDatabaseException( $this->getLastDatabaseErrorStr() );
    }
}

当我调试我的PHP代码(使用XDebug)时,创建新mysqli时不会抛出任何错误或异常

(我跑这行:)

$conn = new MySQLConnection("localhost", "WRONG_USERNAME", "WRONG_PASSWORD", "NON_EXISTANT_DB");

但是当PHPUnit在测试时运行相同的代码时:

public function test_wrongCredentials() {
        $this->object = new MySQLConnection("localhost", "WRONG_USERNAME", "WRONG_PASSWORD", "NON_EXISTANT_DB");
    }

它到达错误处理程序说

  

“mysqli :: mysqli():( HY000 / 1045):拒绝用户访问   'WRONG_USERNAME'@'localhost'(使用密码:YES)“

可能是什么原因,或者有些我不知道的事情?

1 个答案:

答案 0 :(得分:0)

您所获得的异常是预期的,因为您的代码专门抛出它。

在PHPUnit中处理这个问题的方法是使用annotation来告诉它'预期的异常'。在你的情况下,适当的注释是奇怪的,@expectedException

所以你的测试应该是这样的: -

/**
 * @expectedException FailedToConnectDatabaseException
 */
public function test_wrongCredentials() 
{
    $this->object = new MySQLConnection("localhost", "WRONG_USERNAME", "WRONG_PASSWORD", "NON_EXISTANT_DB");
}

这应该让你的测试通过,而不是使用邪恶的@。