2015-09-26 9 views
5

Ich möchte Model-Ereignisse wie 'erstellt' verhindern. 'aktualisiert' usw. beim Testen meiner Anwendung mit phpunit.Wie verhindert man, dass Model Events mit phpunit ausgelöst werden?

In der Dokumentation von Laravel heißt es, dass Sie Ereignisse von Brennen unter Verwendung

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

Aber in meiner Situation verhindern können, habe ich keine Klasse zu erwarten.

Auch wenn ich $this->withoutEvents(); verwende, um alle Ereignisse zu verhindern, werden eloquente Ereignisse ausgelöst.

Wie kann ich eloquente Ereignisse verhindern?

+0

Haben Sie ein Modell mit dem Mockery Paket zu erstellen versucht? Ich denke, das sollte helfen. –

+0

Nein, habe ich nicht. Kannst du genauer sein? –

+0

Dies ist das Spott Repo, sollten Sie es auschecken und die Dokumente https://github.com/padraic/Material –

Antwort

1

Überprüfen Sie die shouldReceive Methode der Model Klasse. Grundsätzlich erstreckt sich die Model Klasse Mockery. Hier ist ein Beispiel, das Sie eine Klasse, unter der Annahme, Car:

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

Dies wird die Datenbank nicht getroffen, sondern stattdessen ein Modell verwenden. Sie können weitere Informationen über Laravel testen finden Sie hier: http://laravel.com/docs/4.2/testing

Hoffe, das hilft.

+0

Dies beantwortet nicht Ihre ursprüngliche Frage, sondern ist eher eine Alternative – cecilozaur

4

Blick in Laravel Api Model::flushEventListeners() sollte "Entfernen Sie alle Event-Listener für das Modell."

EDIT

Sie können auf diese eine benutzerdefinierte Methode Base schreiben:

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()); 
    } 
} 

So etwas wie dieses vielleicht:

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()); 
     } 
    } 
} 

und vielleicht fügen Sie es als ein Merkmal zu den Modellen, oder ein Basismodell, das alle Ihre Modelle erweitern. Dieser Code ist noch nicht getestet, sollte Ihnen aber eine Vorstellung davon geben, wie es gemacht werden kann.

+0

Dies ist sehr nützlich, aber in meiner Situation möchte ich nur einige Modell-Ereignisse verhindern. Zum Beispiel "gespeichert" oder "Erstellen" oder etc. –

+0

Überprüfen Sie meine Bearbeitung, ob es funktioniert –

+0

das scheint gut zu funktionieren, aber ich möchte diese Funktion nicht zu allen meinen Modellen hinzufügen, die getestet werden müssen. Es muss eine Möglichkeit sein, dies direkt aus meiner Testdatei heraus zu tun. –

1

sollten Sie in der Lage sein zu verwenden

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

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

$model->save(); 
+0

Haben Sie diese Lösung versucht? Es gibt eine Ausnahme zurück 'EventTest :: testExample Ausnahme: Die folgenden Ereignisse wurden nicht ausgelöst: [eloquent.Erstellen: App \ Model] ' Ich habe mit verschiedenen Ereignissen auch versucht. –

+0

Ich habe Log verwendet, um alle gefeuerten Ereignisse zu verfolgen, und "eloquent.creating: App \ Model" ist einer der gezündeten. Ich kann nicht verstehen, warum Mockery es nicht verstehen kann. –

+0

Nach vielen Tests habe ich herausgefunden, dass dies nie funktioniert, auch wenn Spott keine Fehler auslöst. –

Verwandte Themen