我想阻止「創建」等模型事件。 '更新'等時使用phpunit測試我的應用程序。如何防止使用phpunit觸發模型事件?
在Laravel它說,你可以防止燒事件的文檔通過使用
$this->expectsEvents(App\Events\UserRegistered::class);
但在我的情況我沒有一流的期待。
即使我使用$this->withoutEvents();
來阻止所有事件,也會觸發雄辯的事件。
如何防止雄辯事件?
我想阻止「創建」等模型事件。 '更新'等時使用phpunit測試我的應用程序。如何防止使用phpunit觸發模型事件?
在Laravel它說,你可以防止燒事件的文檔通過使用
$this->expectsEvents(App\Events\UserRegistered::class);
但在我的情況我沒有一流的期待。
即使我使用$this->withoutEvents();
來阻止所有事件,也會觸發雄辯的事件。
如何防止雄辯事件?
查看Model
類的shouldReceive
方法。基本上Model
類延伸Mockery
。 這裏有一個例子假設你有一個類Car
:
Car::shouldReceive('save')->once();
這不會碰到數據庫,但將使用模擬來代替。你可以在這裏找到更多有關Laravel測試的信息:http://laravel.com/docs/4.2/testing
希望這會有所幫助。
這並不回答你最初的問題,但更多的是替代 – cecilozaur
展望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());
}
}
}
,也許它作爲一個特徵添加到模型,或者所有型號都可以擴展的基本型號。這段代碼沒有經過測試,但應該給你一個如何完成的想法。
這是非常有用的,但在我的情況下,我只想防止一些模型事件。例如'保存'或'創建'等。 –
檢查我的編輯看看它是否工作 –
這似乎工作正常,但我不想將此功能添加到我需要測試的所有模型。它必須是直接從我的測試文件中完成的一種方法。 –
您應該能夠使用
$model = new App\Model($inputs);
$this->expectsEvents(['eloquent.creating: App\Model', 'eloquent.saved: App\Model']);
$model->save();
已經試過這個解決方案? 它會返回一個異常 'EventTest :: testExample 異常:以下事件未被觸發:[雄辯。創建:App \ Model]' 我也嘗試過不同的事件。 –
我已經使用Log來跟蹤所有觸發的事件,'eloquent.creating:App \ Model'是其中一個被解僱的事件。我不明白爲什麼Mockery無法抓住它。 –
經過大量測試後,我發現,即使嘲笑不會觸發錯誤,這種方式也不會起作用。 –
您是否嘗試過創建與嘲弄包一個模擬?我認爲這應該有所幫助。 –
不,我沒有。你可以說得更詳細點嗎? –
這是嘲笑的回購,你應該檢查出來和文檔https://github.com/padraic/mockery –