gpt4 book ai didi

php - 如何在 PHP 中对具有依赖关系的方法进行单元测试?

转载 作者:可可西里 更新时间:2023-11-01 00:51:51 25 4
gpt4 key购买 nike

我有一个包含一些逻辑的方法,但我不确定如何对其进行单元测试。因为它是针对此特定方法的单元测试,所以它应该在不连接到数据库的情况下运行。我阅读了有关 stub 和模型的信息,但找不到将它们应用于这种情况的方法。

我想强制 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 ,以便单元测试无需真正访问数据库即可工作。

结论

  • 如果您有与所提供的代码类似的代码:重构它并使用依赖注入(inject)。
  • 如果您有遗留代码或只是不想重构,请尝试此解决方案:http://sebastian-bergmann.de/archives/885-Stubbing-Hard-Coded-Dependencies.html

  • 最佳答案

    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 还可以 stub 硬编码的依赖项。见

    但是,由于您现在已经注意到测试静态和硬编码依赖关系是一种背后的痛苦,我建议您移除硬编码依赖关系和静态调用,改为使用注入(inject)到 ClientType 中的真实对象。

    另一种选择是使用 http://antecedent.github.io/patchwork (不隶属于它),

    is a PHP library that makes it possible to redefine user-defined functions and methods at runtime, loosely replicating the functionality runkit_function_redefine in pure PHP 5.3 code, which, among other things, enables you to replace static and private methods with test doubles.

    关于php - 如何在 PHP 中对具有依赖关系的方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5561702/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com