PHPUnit RabbitMQ:创建连接函数的写测试

PHPUnit RabbitMQ:创建连接函数的写测试,php,phpunit,rabbitmq,Php,Phpunit,Rabbitmq,我面临以下问题。我编写了一个函数,在给定所需参数的情况下创建连接对象(AMQPConnection)。现在我想编写相应的单元测试。我只是不知道如果没有RabbitMQ代理的运行,怎么做。以下是所讨论的功能: 公共函数getConnection($hostKey,array$params) { $connection=null; 试一试{ $connection=新的AMQPConnection( $params['host'], $params['port'], $params['usernam

我面临以下问题。我编写了一个函数,在给定所需参数的情况下创建连接对象(AMQPConnection)。现在我想编写相应的单元测试。我只是不知道如果没有RabbitMQ代理的运行,怎么做。以下是所讨论的功能:

公共函数getConnection($hostKey,array$params)
{
$connection=null;
试一试{
$connection=新的AMQPConnection(
$params['host'],
$params['port'],
$params['username'],
$params['password'],
$params['vhost']
);
//将此服务器设置为下一个连接的默认连接尝试
$this->setDefaultHostConfig($hostKey,$params);
返回$connection;
}捕获(\Exception$ex){
如果($this->isattemptextended()){
返回$connection;
}否则{
//增量连接连接尝试
$this->setConnectionAttent($this->getConnectionAttent()+1);
返回$this->getConnection($hostKey,$params);
}
}
}

您通常不会将这样的代码作为单元测试进行测试,因为测试结果很可能会告诉您服务器安装正确,而不是代码正常工作

您是否测试PDO是否返回有效的数据库连接

如果您测试您的安装,而不是测试PHPClibs是否正常工作,这可能是有意义的

@chozilla @虫族 由于您的提示,我决定使用闭包来隔离连接到服务器的代码部分。 以下是结束语:

$connectionFunction=function($params){
返回新的AMQPStreamConnection(
$params['host'],
$params['port'],
$params['username'],
$params['password'],
$params['vhost']
);
};
这里是修改后的
getConnection()
函数

/**
*@param string$hostKey主机连接参数集的数组键
*@param array$params连接参数集
*@return null | AMQPStreamConnection
*/
公共函数getConnection($hostKey,array$params)
{
$connection=null;
试一试{
$connection=call_user_func($connectionFunction,$params);
//将此服务器设置为下一个连接的默认连接尝试
$this->setDefaultHostConfig($hostKey,$params);
返回$connection;
}捕获(\Exception$ex){
如果($this->isattemptextended()){
返回$connection;
}否则{
//增量连接连接尝试
$this->setConnectionAttent($this->getConnectionAttent()+1);
返回$this->getConnection($hostKey,$params);
}
}
}
对于单元测试,我执行了以下操作:

$mockConnection=$this->getMockBuilder('PhpAmqpLib\Connection\AMQPStreamConnection'))
->disableOriginalConstructor()
->getMock();
$connectionFunction=函数($params)使用($mockConnection){
返回$mockConnection;
};
或者这个有一个例外

$connectionFunction=function($params){
抛出新\异常;
};

N.B.:我在getConnection()函数中使用
AMQPStreamConnection
,因为
AMQPConnection
PhpAmqpLib

中被标记为不推荐使用。您应该添加一个更改正在实例化的类的功能

  • 添加通过构造函数或setter更改连接器类的功能,默认情况下使用默认的AMQPConnector类。使用它创建连接器对象
  • 为单元测试创建模拟连接器类
  • 在测试中使用它通过构造函数或setter设置模拟类 您还可以对传递给连接器构造函数的参数进行断言


    另一种方法是使用,这样就不会耦合到任何实现。由于您只处理纯接口,因此测试更容易

    嗨,乔兹拉,谢谢你的快速反应。此权限与
    PDO
    数据库
    无关。这类事情可能也会以同样的方式处理,我只是不知道。它是关于RabbitMQ和到代理的连接的。@dickwan它是一样的-您不测试到数据库的连接,也不测试到RabbitMQ的连接,只是因为它不是您的代码-它可以工作,相信它。否则,在开始使用php标准库之前,您必须测试整个php标准库。@zerkms:噢,感谢您的澄清。现在我想知道我如何才能保证代码部分被涵盖。@dickwan制作了一个“集成”或“安装”测试套件。但不要运行它。仅当您安装服务器时。@chozilla:在您的响应之后,为了在我的单元测试中实现良好的代码覆盖率,我选择使用匿名函数返回(注入)AMQPConnection对象。从而将创建到服务器的连接的代码与其他代码隔离开来。稍后我将发布我在代码中更改的内容。