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的应该失败我的测试。
如果根本没有发生“事件”,你的测试应该会失败 - 因为你嘲笑它并且说它应该被解雇'一次'? – Laurence 2015-03-19 16:55:47
您是否调用过'Mockery :: close()'?,另请参阅我对[old SO问题]的解释(http://stackoverflow.com/questions/16035549/mockery-shouldreceive-once-doesnt-seem-to-工作/ 16308814#16308814) – 2015-03-19 20:44:34
非常感谢@BramGerritsen!用一个'Mockery :: close()'语句关闭测试确实解决了它!你能如此善意地将你的评论转换为答案吗?另外我想知道为什么在[Laravel]的官方文档中没有提到(http://laravel.com/docs/4.2/testing#mocking-facades)。 – nstapelbroek 2015-03-19 21:05:05