我开始使用Laravel 4.2,PHPUnit和Mockery编写测试。
我如何断言我正在测试的控制器调用/运行Mock Facade? p>
例如,我为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);
答案 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处理所有这些。