Php 如何正确测试Laravel事件?

Php 如何正确测试Laravel事件?,php,laravel,laravel-4,phpunit,mockery,Php,Laravel,Laravel 4,Phpunit,Mockery,我正在为一个模型编写测试,该模型在其一个属性发生更改时触发事件。不幸的是,我想不出最好的测试方法。型号代码为: class Foo extends Eloquent { public function setNameAttribute($value) { $this->attributes['name'] = $value; if($this->exists && ($this->original['name'] != $v

我正在为一个模型编写测试,该模型在其一个属性发生更改时触发事件。不幸的是,我想不出最好的测试方法。型号代码为:

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都应该通过我的测试。

您必须在
tearDown()
方法中调用
mockry::close()

请参阅关于PHPUnit集成的说明。

如果根本没有发生
事件,您的测试应该会失败-正如您模拟它并说它应该被触发
一次
?您是否调用了
mockry::close()
?,也请参阅我关于非常感谢@BramGerritsen的解释!用
mockry::close()
语句关闭测试确实修复了它!你能把你的评论转换成一个答案吗?另外,我想知道为什么在的官方文档中没有提到这一点。我自己不使用Laravel,但我认为手册中肯定应该提到它。也许你可以通知框架作者。当你必须在官方教程中处理不起作用的示例代码时,在学习框架时没有什么比这更令人沮丧的了。@nstapelbroek请记住,如果你为整个套件设置了
mockry::close()
,那么你就不必在每个测试中调用