如何使用静态调用单元测试函数

时间:2018-03-20 10:58:21

标签: php unit-testing doctrine mockery dbal

我正在编写一个使用Doctrine DBAL系统的函数。这使用静态函数进行连接,如下所示:

$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config);

我想用模拟器对这个功能进行单元测试。

public function openNewConnection(string $database_name): Connection
{
       try {
            // some logic where I check the validity of the connection
            $this->connection = DriverManager::getConnection($connection_params, $config);
            break;
        } catch (Exception $e) {
            // catch the different errors that could be created
        }
    return $this->connection;
}

我不能使用依赖注入作为这种方式:

  • 我正在动态生成$connectionParams:我需要在此处拨打电话
  • 没有(正确的)非静态调用此函数的方法:我只是将问题转移到其他地方

我一直在phpunit工作,而且我也看过嘲笑。我真的不明白我是如何做到这一点的:

这种嘲弄测试不起作用,但我不确定它应该如何:

public function testConnect(): void
{
    // mocked connection return
    $mocked_connection = new Connection([], $this->driver);

    // use Mockery to simulate static call
    $driver_manager = Mockery::mock('alias:\Doctrine\DBAL\DriverManager');
    $driver_manager->shouldReceive('getConnection')
                   ->once()
                   ->andReturn($mocked_connection);

    $database = new Database($this->database_configuration_file);
    $database->openNewConnection('test_db_cluster_01');

    $this->assertEquals($mocked_connection, $database->getConnection());
}

从我所看到的情况来看,$ database甚至不知道$ driver_manager,所以我不知道如何发生嘲弄。

这是我的问题:

  • 甚至可以像这样测试静态调用的函数吗?
  • 如果是这样,是嘲弄/做这个的方法吗?
  • 如果是,我上面的测试有什么问题?

1 个答案:

答案 0 :(得分:1)

  1. 是的,有可能。
  2. 是的,Mockery(以及PHPUnit本身)可以做到这一点(使用"假自动加载")。查看this article了解详情。
  3. 我在测试中没有发现任何问题。请检查repo。我试图重现你的问题,但一切都顺利。