首页 > 文章列表 > PHP 单元测试:如何对依赖项进行测试?

PHP 单元测试:如何对依赖项进行测试?

php 单元测试
500 2024-12-29

PHP 单元测试:依赖项测试如何测试依赖项:注入依赖项:将依赖项注入到被测代码中,例如通过构造函数。使用测试双工:使用存根、模拟或间谍来替换实际依赖项,并验证其行为。

PHP 单元测试:如何对依赖项进行测试?

PHP 单元测试:如何对依赖项进行测试

当编写 PHP 单元测试时,你可能会遇到需要对具有外部依赖项的代码进行测试的情况。要有效地测试这些依赖项,可以使用以下方法:

注入依赖项

此方法涉及将依赖项注入被测试的代码中。例如:

use PHPUnitFrameworkTestCase;

class FooTest extends TestCase
{
    public function testBar()
    {
        $bar = new Bar();
        $foo = new Foo($bar);

        // 测试 Foo...
    }
}

在这个例子中,$bar 依赖项被注入到 Foo 类的构造函数中。

使用测试双工

测试双工是一种可以替换实际依赖项的虚拟对象。有不同类型的测试双工,例如:

  • 存根(Stub): 提供预定义的行为,而无需实际执行依赖项的代码。
  • 模拟(Mock): 提供可验证行为的虚拟对象,例如被调用的方法、参数和返回的值。
  • 间谍(Spy): 允许你记录或跟踪依赖项的行为,例如被调用的方法和参数。

要创建测试双工,可以使用以下工具:

  • PHPUnit MockBuilder
  • Prophecy

实战案例

考虑一个 Database 类,它依赖于 PDO 类。要测试 Database 类,可以使用存根来替换 PDO 类:

use PHPUnitFrameworkTestCase;
use ProphecyProphet;

class DatabaseTest extends TestCase
{
    protected $prophet;

    public function setUp()
    {
        $this->prophet = new Prophet();
    }

    public function tearDown()
    {
        $this->prophet->checkPredictions();
    }

    public function testConnect()
    {
        $pdoStub = $this->prophet->prophesize(PDO::class);
        $pdoStub->connect()->shouldBeCalledOnce();

        $database = new Database($pdoStub->reveal());
        $database->connect();
    }
}

在这个例子中,PDOStub 是一个存根,它被注入到 Database 类中。mockery 工具用于验证 connect() 方法是否被调用了一次。