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

在 php 单元测试中,模拟和桩技术可用于:模拟:使用假对象替换依赖项,控制行为并验证交互。桩:创建专门的假接口,验证依赖项的调用情况。模拟可使用 $this->getmockbuilder() 和 ->getmock() 方法创建,用于设

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 单元测试中的模拟与桩技术的详细内容,更多请关注叮当号网其它相关文章!

文章来自互联网,只做分享使用。发布者:代号邱小姐,转转请注明出处:https://www.dingdanghao.com/article/442462.html

(0)
上一篇 2024-05-06 18:00
下一篇 2024-05-06 18:00

相关推荐

联系我们

在线咨询: QQ交谈

邮件:442814395@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信公众号