【问题标题】:Mockery - partial mocks嘲弄 - 部分模拟
【发布时间】: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]');

实际上是发送一封电子邮件。

谁能解释一下这些差异(尤其是比较部分模拟和普通标准模拟)以及何时使用特定类型的模拟。

【问题讨论】:

标签: php unit-testing mockery


【解决方案1】:
class ClassYouWantToTest {

  public function a();

  public function b();

}

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

要恢复,您仅对您要测试的类使用部分模拟,如果您必须模拟他们的方法之一。

【讨论】:

  • 所以它只在类范围中使用(在类方法之间)?我从来不需要它来测试不同的类?
  • 是的,在类范围内(实际上是您要测试的类,否则您使用通常的模拟)。事实上,你不需要类之间。在这种情况下,请使用普通模拟。
猜你喜欢
  • 2014-10-19
  • 2014-01-29
  • 2019-06-26
  • 2016-08-03
  • 2015-06-21
  • 2018-04-05
  • 2015-07-17
  • 2019-04-20
  • 1970-01-01
相关资源
最近更新 更多