>  기사  >  백엔드 개발  >  PHP 단위 테스트의 모의 및 스텁 기술

PHP 단위 테스트의 모의 및 스텁 기술

WBOY
WBOY원래의
2024-05-06 17:42:011166검색

在 PHP 单元测试中,模拟和桩技术可用于:模拟:使用假对象替换依赖项,控制行为并验证交互。桩:创建专门的假接口,验证依赖项的调用情况。模拟可使用 $this->getMockBuilder() 和 ->getMock() 方法创建,用于设置预期行为和断言。桩可使用 ->see() 方法进行断言。这些技术有助于隔离代码并验证依赖项的交互,如使用 ProductService 模拟検証 calculateTotal() 函数处理数据。

PHP 单元测试中的模拟与桩技术

PHP 单元测试中的模拟与桩技术

在单元测试中,模拟和桩技术对于孤立代码和验证其与依赖项之间的交互非常重要。PHP 中有许多可用的框架和工具来实施这些技术。

模拟

模拟是一种替换实际依赖项的假对象,它允许您控制其行为并验证与它的交互。PHPUnit 中的 $this->getMockBuilder()->getMock() 方法可用于创建模拟对象。

示例:

// 在 $object 中模拟 MyService 类
$mock = $this->getMockBuilder(MyService::class)
    ->disableOriginalConstructor()
    ->getMock();

// 设置 mock 方法的预期行为
$mock->expects($this->once())
    ->method('doSomething')
    ->with('arg1', 'arg2')
    ->willReturn('result');

// 与模拟对象交互并进行断言
$this->assertSame('result', $object->doSomething('arg1', 'arg2'));

桩是一种为实际依赖项创建专用接口的假对象。它允许您验证依赖项是否在预期的情况下被调用。PHPUnit 中的 ->see() 方法可用于进行桩断言。

示例:

// 为 $service 创建二重桩
$stub = $this->createMock(MyService::class);

// 设置实际依赖项,以便稍后断言
$object = new MyObject($stub);

// 与实际对象交互
$object->doSomething();

// 验证桩是否被调用
$this->assertTrue($stub->expects($this->once())
    ->method('doSomething')
    ->with('arg1', 'arg2')
    ->hasBeenCalled());

实战案例:

假设我们有一个函数 calculateTotal(),它从 ProductService 中获取产品数据。我们可以使用模拟技术来隔离 ProductService,并验证 calculateTotal() 是否正确处理数据。

// 使用模拟来验证 calculateTotal()
$productServiceMock = $this->getMockBuilder(ProductService::class)
    ->disableOriginalConstructor()
    ->getMock();

$productServiceMock->expects($this->once())
    ->method('getProducts')
    ->willReturn([
        ['id' => 1, 'price' => 10],
        ['id' => 2, 'price' => 20]
    ]);

$total = calculateTotal($productServiceMock);

$this->assertEquals(30, $total);

위 내용은 PHP 단위 테스트의 모의 및 스텁 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.