断言Mock Facade在Laravel 4中被调用/运行

时间:2014-10-09 14:52:16

标签: php unit-testing laravel phpunit mockery

我开始使用Laravel 4.2PHPUnitMockery编写测试。

我如何断言我正在测试的控制器调用/运行Mock Facade?

例如,我为Queue获得了以下Mockery。我的控制器没有返回与Queue::push()有关的任何内容,所以有没有办法断言它触发了Queue::push()

Queue::shouldReceive('push')->once();
Queue::shouldReceive('connected')->once();

如果我在控制器中注释掉Queue::push(),则Queue::shouldReceive会抛出异常:

  

Mockery \ Exception \ InvalidCountException:应该完全调用Mockery_0_Illuminate_Queue_QueueManager中的方法push()1   时间,但被称为0次。

断言Mock Facade运行的唯一方法是执行以下操作吗?

    $queuepushran = false;
    try {
        Queue::shouldReceive('push')->once();
        Queue::shouldReceive('connected')->once();
        $queuepushran = true;           
    } catch (\Mockery\Exception\InvalidCountException $e) {
        //Queue threw an exception
        $queuepushran = false;
    }
    $this->assertTrue($queuepushran);

1 个答案:

答案 0 :(得分:1)

您正在使用模拟对象和期望来测试这一点,但这并不是应该如何使用模拟。您的代码片段似乎缺少实际调用控制器,因此很难确切地说出正在进行的操作,但我只是在完整的示例中运行。

您希望在控制器方法运行时测试,Queue外观的push()connected()方法每次调用一次。我们想要做的是使用Laravel的酷外观功能用模拟门代替Queue外观后面的真实QueueManager类,这样当控制器调用Queue::push(..)时,它将调用我们的模拟对象而不是

所以,让我们开始构建测试:

public function testSomeControllerMethodCallsTheQueue()
{
    Queue::shouldReceive('push')->once();
    Queue::shouldReceive('connected')->once();
}

我们现在已经将真实的QueueManager换成了我们的模拟器,并设置了我们期望它们被调用的方式。由于每项测试只应该做一件事,我们现在已经做了我们需要做的所有事情来安排'测试。

接下来,我们需要采取行动。通过致电控制器。

public function testSomeControllerMethodCallsTheQueue()
{
    Queue::shouldReceive('push')->once();
    Queue::shouldReceive('connected')->once();

    $this->action('GET', 'YourController@method');
}

最后一步是“断言”,但我们实际上并不需要做任何事情。如果我们的Mockery期望得到满足,测试将完成并变为绿色。如果不满足我们的Mockery期望,将抛出异常并且测试将变为红色。 Mockery抛出的例外情况是未通过测试的,你不需要做出断言,比如将返回值或响应与你期望的结果进行比较--Mockery处理所有这些。