嘲弄 - 部分嘲笑

时间:2017-07-21 08:23:13

标签: php unit-testing mockery

我在理解部分嘲笑的用途时遇到了问题。下面是一个非常简单的例子:

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]');

实际发送电子邮件。

有没有人能解释我这些差异(特别是比较部分模拟与普通标准模拟)以及何时使用特定类型的模拟。

1 个答案:

答案 0 :(得分:1)

class ClassYouWantToTest {

  public function a();

  public function b();

}

如果你的方法a()使用方法b()并且你想模拟b()只测试a(),那么你必须为你的类使用部分模拟。

要继续,如果您必须模拟其中一种方法,则仅对要测试的课程使用部分模拟