2015-09-26 41 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

經過大量測試後,我發現,即使嘲笑不會觸發錯誤,這種方式也不會起作用。 –

相關問題