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

2024年 5月 6日 60.0k 0

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

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

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 单元测试中的模拟与桩技术的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论