2016-09-21 5 views
2

Ich bin ziemlich neu in der Testwelt und versuche, mich mit Spott und Spott zu beschäftigen. Ich weiß, wie man bestimmte Klassen verspottet, die gerufen werden. Zum Glück macht Laravel das sehr einfach.

Im Laufe der Zeit habe ich gelernt, dass Sie Ihre Methoden z. B. in die Controller-Klassen in kleinere Stücke teilen. So macht jede dieser kleineren Methoden mehr oder weniger nur eine Sache und das ist, wie ich hörte, viel besser zum Testen.

Lässt meine Controller-Klasse das sieht aus wie nehmen:

class MyController extends Controller 
{ 
    public function myMethod($request) 
    { 
    $this->validateRequest($request); 
    $response = App\ModelClass::doSomething(); 
    return response()->json($response) 
    } 

    protected function validateRequest($request) 
    { 
    // do some validation here 
    } 
} 

Wie ich es verstehe, sind Unit-Tests verwendet, um die Methoden isoliert zu überprüfen und ich sollte den Code in so wenig Brocken wie möglich teilen Sie es zu machen einfacher, sie zu prüfen (so eine Methode macht nur eine Sache usw.)

Ist es eine gute Praxis zu testen, in diesem Beispiel myMethod isoliert und prüfen, ob es die anderen Methoden ruft? Ich weiß, das funktioniert nicht, aber kann ich es ähnlich ähnlich machen? Und sollte ich es so machen?

\Mockery::mock('App\Http\Controllers\MyController') 
    ->shouldReceive('validateRequest') 
    ->once(); 

Antwort

1

Leider können Sie nicht öffentliche Methoden abfangen. Dies ist ein Teil eines Komponententests und sollte daher ordnungsgemäß ausgeführt werden. Wenn Sie innerhalb dieser Methode Teil einer Logik abfangen wollen Sie Refactoring es zu einer Serviceklasse denken sollte und dann kann man es so nennen:

public function myMethod($request) 
{ 
    app(RequestService::class)->validateRequest($request); 
    $response = App\ModelClass::doSomething(); 
    return response()->json($response) 
} 

dann können Sie verspotten es mögen:

App::shouldReceive('make->validateRequest') (...) 
+0

Danke, das wirft Licht ins Ganze =) Ich habe jetzt auch einige Infos gefunden, dass man in der Regel nur Unit-Test Laravel Controller nicht testen sollte. Sie sollen über http aufgerufen und dann als Ganzes ausgeführt werden. Ich denke, ich muss nur Funktionstests dafür verwenden und den Controller und die Mitgliedsfunktionen testen, die es als Ganzes aufruft. Zum Glück kann ich immer noch jede Service-Klasse, wie du sie erklärt hast, nachmachen. – Chris

Verwandte Themen