2017-12-14 1 views
3

Symfony Projekt PHPUnit TestabdeckungPHPUnit für meine Usercontroller deckt nicht alle Linien

Usercontroller

public function userEdit($id, Request $request) 
    { 

     $user = $this->userRepository->findOneByCode($id); 

     if (!$user) { 
      throw new Exception("User not found!"); 
     } 

     $userForm = $this->createForm(UserForm::class, $user); 
     $userForm->handleRequest($request); 

     if ($userForm->isSubmitted() && $userForm->isValid()) { 
      $this->userService->save($user); 

      return $this->redirectToRoute('user_list'); 
     } 

     return $this->render(
      'user/user.html.twig', [ 
      'form' => $userForm->createView(), 
      ] 
     ); 
    } 

TestUserController

public function testUserEdit() 
    { 
     $client = static::createClient(); 
     $crawler = $client->request('GET', '/user/test/edit'); 

     $formData = array(
      'username' => 'test', 
      'email' => '[email protected]', 
      'roles' => 'ROLE_ADMIN' 
     ); 

     $this->assertEquals(
      200, 
      $client->getResponse()->getStatusCode() 
     ); 


     $form = $this->factory->create(UserForm::class); 
     $object = User::fromArray($formData); 

     $form->submit($formData); 
     $this->assertTrue($form->isSynchronized()); 
     $this->assertEquals($object, $form->getData()); 

     $view = $form->createView(); 
     $children = $view->children; 

     foreach (array_keys($formData) as $key) { 
      $this->assertArrayHasKey($key, $children); 
     } 

    } 

Im UserEdit Verfahren wir, wenn Schleife haben. Aber wenn wir den PHPunit-Coverage-Test ausführen, wird die if-Schleife nicht ausgeführt. Die andere if-Schleife zum Senden ist ebenfalls nicht abgedeckt.

Was läuft schief und was kann ich tun, um den Test abzudecken? Dies ist auch die beste Lösung für Symfony Form Test, da ich neu bei PHPunit bin.

Antwort

0

bemerkte ich ein paar Dinge in Ihrem Code, der falsch scheinen:

Die userEdit Methodenname userEditAction sein sollte.

Wählen Sie das Formular wie folgt aus: $form = $crawler->selectButton('submit')->form();

Das 'Senden' Text das Etikett auf der Submit-Button (z Speichern). Und dann, nachdem die Felder ausfüllen: $crawler = $client->submit($form);

Sie überprüfen, ob das war mit der Behauptung, dass die resultierende HTML-Seite enthält erwartetes Element (zum Beispiel) erfolgreich einreichen:

$this->assertGreaterThan(0, $crawler->filter('h1')->count());

Btw. Put: $client->followRedirects(true); nach dem Instanziieren des Clients.

Beispiele sind von der official docs.

In Bezug auf einige Zeilen, die nicht durch den Test abgedeckt wurden: Wenn Sie die Klausel if haben, müssen Sie beide Bedingungen testen. In Ihrem Fall haben Sie wahrscheinlich zuerst einen gültigen Benutzer, Instanz User, und der andere Fall sollte sein, dass Sie dort einen ungültigen Benutzer (Null oder was auch immer) übergeben. Dies wird normalerweise unter Verwendung von @dataProvider Annotation und Methode erreicht. Die Datenprovidermethode liefert Datensets an die Testmethode. Es kann mehr als einen Satz geben, so dass ein anderer Satz ungültige Daten enthält, um das andere Ergebnis der Klausel if() abzudecken.

Diese blog hat tolle Beispiele.

+0

Das hat mein Problem nicht gelöst. Vielen Dank für Ihre Hilfe. – user8928150

0

Um den Inhalt der if-Bedingungen abzudecken, müssen Sie die Bedingungen für neue Tests erfüllen. Um die erste einzugeben, wenn Sie zum Beispiel einen Test schreiben müssen, bei dem Sie die userRepository mocken und findOneByCode null zurückgeben. Dann wird die folgende if-Bedingung ausgeführt und eine Ausnahme ausgelöst. Schließlich testen Sie im Test auf eine ausgelöste Ausnahme. Für die andere if-Bedingung verfahren Sie in ähnlicher Weise. Schreiben Sie einen neuen Test, der die Bedingung erfüllen und den darin enthaltenen Code testen soll.

+0

Ich glaube nicht, dass dies die Methode ist, da die Symfony-Dokumentation ein Beispiel zeigt. – user8928150

+0

Mein Fehler. Anscheinend probierst du Funktionstests und keine Unit-Tests. Für die erste if-Bedingung können Sie versuchen, einfach eine falsche ID anzugeben. Es sollte nicht vom Repository gefunden werden und eine Ausnahme auslösen. – Tamali

Verwandte Themen