【发布时间】:2017-12-27 05:03:35
【问题描述】:
我在理解 部分模拟 的用途方面遇到了问题。下面是一个非常简单的例子:
UserEventTest.php
class UserEventTest extends PHPUnit_Framework_TestCase {
public function tearDown()
{
Mockery::close();
}
/**
* @test
*/
public function user_register()
{
$mailer = Mockery::mock('\App\Mailer');
$mailer->shouldReceive('setEmail')
->shouldReceive('sendActivationMessage')
->andReturn(true);
$user = Mockery::mock(\App\User::class);
$user->shouldReceive('getEmail')
->andReturn('test@test.com');
$userEventHandler = new \App\UserEventHandler($mailer, $user);
$this->assertEquals(true, $userEventHandler->onUserRegister());
}
}
这个测试通过并且实际上并没有发送电子邮件(所以没关系)。当我将此模拟更改为部分模拟时,如下所示:
$mailer = Mockery::mock('\App\Mailer')->makePartial();
它也通过了,但我想知道为什么以及有什么区别?
例如,将其更改为:
$mailer = Mockery::mock('\App\Mailer[setEmail]');
实际上是发送一封电子邮件。
谁能解释一下这些差异(尤其是比较部分模拟和普通标准模拟)以及何时使用特定类型的模拟。
【问题讨论】:
-
Uncle Bob 很好地解释了所有可能的测试替身之间的区别:8thlight.com/blog/uncle-bob/2014/05/14/TheLittleMocker.html
标签: php unit-testing mockery