Décrivez ici votre problème ou ce que vous cherchez à faire.

Salut àvous!
Je suis la formation mise en pratique de la POO de Mr Grafikart,
(Ma configuration :PHP 8.2.0 et Phpunit 9.5.9) et pour le chapitre "recupérer les articles, je voudrais que quelqu'un m'aide pour pouvoir utiliser prophecy dans ces conditions

Ce que je veux
public function setUp(): void
{
/pour passer les parametres du BlogAction
on cree des faux objets renderer et PDo et Router
en utilisant prophecy de phpunit qui cree des faux objects
/

   $this->renderer = $this->prophesize(RendererInterface::class);
 ici je veux ecrire $this->renderer->render() ( render est une function de RendererInterface

//PDO
$this->pdo = $this->prophesize(\PDO::class);
$this->pdo = $this->prophesize(\PDOStatement::class);
$this->router = $this->prophesize(Router::class);
$this->action = new BlogAction(
$this->renderer->reveal(),
$this->pdo->reveal(),
$this->router->reveal()
);
}
Décrivez ce que vous cherchez à obtenir.

Ce que j'obtiens
$this->renderer n'a pas cette fonction render ..
Décrivez vos éventuelles erreurs ou ce que vous obtenez à la place de ce que vous attendez :
PHPUnit 9.5.9 by Sebastian Bergmann and contributors.

E 1 / 1 (100%)

Time: 00:00.951, Memory: 8.00 MB

There was 1 error:

1) Tests\App\Blog\Actions\BlogActionTest::testShowRedirect
Prophecy\Exception\Doubler\MethodNotFoundException: Method Double\stdClass\P1::reveal() not found.

F:\Desktop\MyFrameWork\tests\Blog\Actions\BlogActionTest.php:53

2 réponses


Hello :)

Fais voir le code de ce fichier: Tests\App\Blog\Actions\BlogActionTest

Et montres aussi le code de ce fichier: Double\stdClass\P1 (d'ailleurs tu as ajouté Double dans l'autoload?)

lasa
Auteur

Bonjour popotte

j'ai soulutionné le problème comme ssuit:
1: j'ai installé via composer phpunit 9.5.9 au lieu de phpunit 10.0.16
2: j'ai installé "phpspec/prophecy-phpunit": "^2.0"
3 et dans le code j'utilise "use ProphecyTrait;
ainsi dans composer.json j'ai:
"require-dev": {

    "squizlabs/php_codesniffer": "^3.7",
    "robmorgan/phinx": "^0.13.4",
    "fakerphp/faker": "^1.21",
    "phpunit/phpunit": "9.5.9",
    "phpspec/prophecy-phpunit": "^2.0"
}

et le code :
<?php

namespace Tests\App\Blog\Actions;

use App\Blog\Actions\BlogAction;
use Framework\Renderer\RendererInterface;
use Framework\Router;
use GuzzleHttp\Psr7\ServerRequest;
use PHPUnit\Framework\TestCase;
use Prophecy\Argument;
use Prophecy\PhpUnit\ProphecyTrait;
use stdClass;

/**

  • @TODO:Define a class here
    */
    class BlogActionTest extends TestCase
    {

    /*

    • @var BlogAction
      */
      private $action;

    /*

    • @var RendererInterface
      */
      private $renderer;

    /*

    • @var PDO
      */
      private $pdo;

    private $router;

    use ProphecyTrait;

    public function setUp(): void
    {
    /pour passer les parametres du BlogAction
    on cree des faux objets renderer et PDo et Router
    en utilisant prophecy de phpunit qui cree des faux objects
    /

    $this->renderer=$this->prophesize(RendererInterface::class);

    $this->renderer->render(Argument::any())->willReturn('') ;
    //faux article
    $post = new stdClass;
    $post->id=9;
    $post->slug= 'demo-test';
    //PDO
    $this->pdo = $this->prophesize(\PDO::class);
    $pdoStatement = $this->prophesize(\PDOStatement::class);
    $this->pdo->prepare(Argument::any())->willReturn($pdoStatement);
    $pdoStatement->execute(Argument::any())->willReturn(true);
    $pdoStatement->fetch()->willReturn($post);
    $this->router = $this->prophesize(Router::class);
    $this->action = new BlogAction(
    $this->renderer->reveal(),
    $this->pdo->reveal(),
    $this->router->reveal()
    );
    }

    public function testShowRedirect()
    {

    $request = (new ServerRequest('GET', '/'))
        ->withAttribute('id', 9)
        ->withAttribute('slug', 'demo');
    $response = call_user_func_array($this->action,[$request]);
    $this->assertEquals(301, $response->getStatusCode());

    }
    }
    Finalement le test passe au vert.
    Merci à vous popotte
    !