2015-09-26 93 views
5

我想阻止“创建”等模型事件。 '更新'等时使用phpunit测试我的应用程序。如何防止使用phpunit触发模型事件?

在Laravel它说,你可以防止烧事件的文档通过使用

$this->expectsEvents(App\Events\UserRegistered::class);

但在我的情况我没有一流的期待。

即使我使用$this->withoutEvents();来阻止所有事件,也会触发雄辩的事件。

如何防止雄辩事件?

+0

您是否尝试过创建与嘲弄包一个模拟?我认为这应该有所帮助。 –

+0

不,我没有。你可以说得更详细点吗? –

+0

这是嘲笑的回购,你应该检查出来和文档https://github.com/padraic/mockery –

回答

1

查看Model类的shouldReceive方法。基本上Model类延伸Mockery。 这里有一个例子假设你有一个类Car

Car::shouldReceive('save')->once(); 

这不会碰到数据库,但将使用模拟来代替。你可以在这里找到更多有关Laravel测试的信息:http://laravel.com/docs/4.2/testing

希望这会有所帮助。

+0

这并不回答你最初的问题,但更多的是替代 – cecilozaur

4

展望Laravel Api Model::flushEventListeners()应该“删除模型的所有事件侦听器”。

编辑

您可以在这一个编写自定义的方法的基础:

public static function flushEventListeners() 
{ 
    if (! isset(static::$dispatcher)) { 
     return; 
    } 
    $instance = new static; 
    foreach ($instance->getObservableEvents() as $event) { 
     static::$dispatcher->forget("eloquent.{$event}: ".get_called_class()); 
    } 
} 

事情是这样的,也许:

public static function flushEventListenersProvided($events) 
{ 
    if (! isset(static::$dispatcher)) { 
     return; 
    } 
    $instance = new static; 
    foreach ($instance->getObservableEvents() as $event) { 
     if(in_array($event, $events)){ 
      static::$dispatcher->forget("eloquent.{$event}: ".get_called_class()); 
     } 
    } 
} 

,也许它作为一个特征添加到模型,或者所有型号都可以扩展的基本型号。这段代码没有经过测试,但应该给你一个如何完成的想法。

+0

这是非常有用的,但在我的情况下,我只想防止一些模型事件。例如'保存'或'创建'等。 –

+0

检查我的编辑看看它是否工作 –

+0

这似乎工作正常,但我不想将此功能添加到我需要测试的所有模型。它必须是直接从我的测试文件中完成的一种方法。 –

1

您应该能够使用

$model = new App\Model($inputs); 

$this->expectsEvents(['eloquent.creating: App\Model', 'eloquent.saved: App\Model']); 

$model->save(); 
+0

已经试过这个解决方案? 它会返回一个异常 'EventTest :: testExample 异常:以下事件未被触发:[雄辩。创建:App \ Model]' 我也尝试过不同的事件。 –

+0

我已经使用Log来跟踪所有触发的事件,'eloquent.creating:App \ Model'是其中一个被解雇的事件。我不明白为什么Mockery无法抓住它。 –

+0

经过大量测试后,我发现,即使嘲笑不会触发错误,这种方式也不会起作用。 –

相关问题