[英]How to unit test a method with dependencies in PHP?
我有一个带有一些逻辑的方法,而且我不确定如何对其进行单元测试。 因为这是此特定方法的单元测试,所以它应在不连接数据库的情况下运行。 我读到了有关存根和样机的信息,但找不到将它们应用于这种情况的方法。
我想强制Client:GetClient返回具有正确属性的客户端对象,以便测试每个逻辑分支。
class ClientType {
function GetClientType($id) {
$objClient = Client::GetClient($id);
if ($objClient->Returning == 1) {
return 'returning';
}
else {
return 'normal';
}
}
这是我想到的测试
class ResourceTest extends PHPUnit_Framework_TestCase {
function testGetClientType() {
$objClientType = new ClientType();
$this->assertTrue($objClientType->GetClientType(100), 'normal');
}
}
问题是依赖项$ objClient = Client :: GetClient($ id); GetClient将从数据库中拉出客户端,但是我需要用Stub替换它,以便单元测试可以正常工作而无需访问数据库。
使用PHPUnit,您可以执行
$class = $this->getMockClass(
'Client', /* name of class to mock */
array('getClient') /* list of methods to mock */
);
$class::staticExpects($this->any())
->method('getClient')
->will($this->returnValue('foo'));
通常,您希望避免使用静态方法:
更新后编辑
PHPUnit还可以对硬编码的依赖项进行存根。 看到
但是,由于您现在已经注意到测试静态和硬编码的依赖项是一个难题,因此建议您使用注入到ClientType中的真实对象删除硬编码的依赖项和静态调用。
另一种选择是使用http://antecedent.github.io/patchwork (不附带它),
是一个PHP库,可以在运行时重新定义用户定义的函数和方法,以纯PHP 5.3代码轻松复制功能runkit_function_redefine,除其他功能外,还可以用测试双精度替换静态和私有方法。
尝试模拟解决此类问题。 我不知道PHP,但是在这种情况下我们使用Java和C#进行模拟。
编辑
很抱歉,我没有看到您遇到模拟问题。 通常,对于Mocks,您会告诉他们您对他们的期望,他们也会做出同样的反应。 LSV原理正在模拟中使用。 至于PHP,很抱歉,我不知道要使用哪种工具进行模拟以及如何使用它们
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.