J'ai un controller HomeController qui affiche ma page d'accueil et une liste de tricks (figures de snow).
J'aimerais faire des tests unitaires dessus pour vérifier qu'il revoit bien un objet Reponse. Voici donc le code que j'ai fait:
<?php
namespace App\Controller;
use App\Repository\TrickRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class HomeController extends AbstractController
{
/**
* @Route("/", name="home")
*/
public function index(TrickRepository $repo)
{
$tricks = $repo->findAll();
return $this->render('home.html.twig', [
'tricks' => $tricks,
]);
}
}
<?php
namespace App\Tests\Controller;
use App\Controller\HomeController;
use App\Repository\TrickRepository;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\Response;
class HomeControllerTest extends WebTestCase
{
public function testIndex()
{
$repo = $this->createMock(TrickRepository::class);
$homepage = new HomeController();
$returnTest = $homepage->index($repo);
$this->assertInstanceOf(Response::class, $returnTest);
}
}
Si je lance PhpUnit j'ai cette erreur :
There was 1 error:
1) App\Tests\Controller\HomeControllerTest::testIndex
Error: Call to a member function has() on null
C:\Users\Shiyo\Desktop\Formation\Projet\Projet6_SnowTricks\Code\SnowTricks\vendor\symfony\framework-bundle\Controller\AbstractController.php:245
C:\Users\Shiyo\Desktop\Formation\Projet\Projet6_SnowTricks\Code\SnowTricks\vendor\symfony\framework-bundle\Controller\AbstractController.php:257
C:\Users\Shiyo\Desktop\Formation\Projet\Projet6_SnowTricks\Code\SnowTricks\src\Controller\HomeController.php:19
C:\Users\Shiyo\Desktop\Formation\Projet\Projet6_SnowTricks\Code\SnowTricks\tests\Controller\HomeControllerTest.php:18
C'est le AbstractController avec sa fonction has() qui merde car il détecte que la liste des tricks est vide (forcément c'est un mock). Le seul moyen que j'ai trouvé pour enlever cette erreur est de supprimer le
extends AbstractController
en modifiant toute la classe en conséquence pour qu'elle fonctionne quand même correctement. Je trouve nul de modifier tous mes controllers en les rendant moins lisibles juste pour des test unitaires. Il doit y avoir un autre moyen mais je n'arrive pas à trouver lequel.
// tests/Controller/PostControllerTest.php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class PostControllerTest extends WebTestCase
{
public function testShowPost()
{
$client = static::createClient();
// Tu passe juste l'url à tester
$client->request('GET', '/post/hello-world');
$this->assertEquals(200, $client->getResponse()->getStatusCode());
}
}
Making functional apps for digital products @NEOTIC
Merci je comprend un peu mieux la différence entre les deux.
Il faut pour le projet que je face des tests unitaires uniquement. Je dois simplement vérifier que mon controller renvois un objet Response. Or je ne peut pas le faire à cause du Abstract Controller qui bloque avec sa fonction has().
Je vais me pencher sur la différence entre test unitaire et fonctionnel car visiblement j'ai pas encore tout saisit. Merci pour les infos et le code!
Symfony 5-Conflit entre AbstractController et mock
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Making functional apps for digital products @NEOTIC
-
Making functional apps for digital products @NEOTIC
-
Making functional apps for digital products @NEOTIC
-