2015-03-19 63 views
5

我正在编写一个模型的测试,当其中一个属性发生变化时触发一个事件。不幸的是,我无法弄清楚测试这个的最好方法。该模型的代码是:我如何正确测试Laravel事件?

class Foo extends Eloquent { 
    public function setNameAttribute($value) { 
     $this->attributes['name'] = $value; 
     if($this->exists && ($this->original['name'] != $value)) { 
      Event::fire('foo.NameChange', array($this)); 
     } 
    } 
} 

我对事件火灾初始测试:

$bar = Foo::first(); 
Event::shouldReceive('fire')->once()->with('foo.NameChange', array($bar)); 
$bar->name = 'test'; 

问题是,上面的测试还通过如:

  • 没有事件发生在所有
  • 我第二次更改模型的名称(这应该是第二次激发 事件,对吗?)

如何让我的测试仅在发生一个foo.NameChange事件时才能通过?所有其他senario的应该失败我的测试。

+0

如果根本没有发生“事件”,你的测试应该会失败 - 因为你嘲笑它并且说它应该被解雇'一次'? – Laurence 2015-03-19 16:55:47

+0

您是否调用过'Mockery :: close()'?,另请参阅我对[old SO问题]的解释(http://stackoverflow.com/questions/16035549/mockery-shouldreceive-once-doesnt-seem-to-工作/ 16308814#16308814) – 2015-03-19 20:44:34

+0

非常感谢@BramGerritsen!用一个'Mockery :: close()'语句关闭测试确实解决了它!你能如此善意地将你的评论转换为答案吗?另外我想知道为什么在[Laravel]的官方文档中没有提到(http://laravel.com/docs/4.2/testing#mocking-facades)。 – nstapelbroek 2015-03-19 21:05:05

回答

2

您必须在tearDown()方法中调用Mockery::close()。 查看关于PHPUnit集成的Mockery docs