PHPUnit запустить обратный вызов при неудачном утверждении - PullRequest
0 голосов
/ 29 марта 2019

Я тестирую приложение Symfony.

, когда утверждение не удается, я хотел бы увидеть вывод HTML веб-клиента.Я ищу короткую и элегантную версию этого:

if(1 !== $crawler->filter('.flash-success')->count())
    file_put_contents("debug.html", $this->client->getResponse()->getContent());
$this->assertEquals(1, $crawler->filter('.flash-success')->count());

Я предлагаю зарегистрировать обратный вызов, который получает 3-й параметр assertXXX:

// ideally like this
phpunit_register_callback(write_to_disk_callback);
$this->assertEquals(1, $crawler->filter('.flash-success')->count(), $this->client->getResponse()->getContent());

В моемЕсли обратный вызов должен записать сообщение в файл на диске, чтобы я мог открыть его с помощью браузера ...

function write_to_disk_callback($message){
    file_put_contents("debug.html", $message);
}

1 Ответ

2 голосов
/ 29 марта 2019

Думаю, стоит взглянуть на слушателей phpunit

Вот небольшой пример того, как вы внедряете слушателя в свой SF-проект

Сначала вы должны создать слушателя:

<?php

namespace Tests\PHPUnit;

use PHPUnit\Framework\AssertionFailedError;
use PHPUnit\Framework\Test;
use PHPUnit\Framework\TestListener;
use PHPUnit\Framework\TestListenerDefaultImplementation;
use Symfony\Bundle\FrameworkBundle\Client;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class SimpleTestListener implements TestListener
{
    use TestListenerDefaultImplementation;

    public function addFailure(Test $test, AssertionFailedError $e, float $time): void
    {
        if ($test instanceof WebTestCase && method_exists($test, 'getClient')) {
            /** @var Client $client */
            $client = $test->getClient();

            // Write the client response to a file
        }
    }
}

Затем добавьте слушатель в свой phpunit.xml:


<listeners>
    ...
    <listener class="Tests\PHPUnit\SimpleTestListener"/>
</listeners>

Наконец, обновите свой тестовый файл:

<?php

namespace Tests\PHPUnit\YesWeHack;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class MyTest extends WebTestCase
{
    static private $client;

    static public function getClient()
    {
        return static::$client;
    }

    protected static function createClient(array $options = [], array $server = [])
    {
        static::$client = parent::createClient($options, $server);

        return static::$client;
    }

    public function testReportIsFixed()
    {
        $client = static::createClient();

        $client->request('GET', '/');

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

Обратите внимание, что класс MyTest является просто примером и не должен использоваться таким образом, он только для целей примера. По крайней мере, вы должны переместить статику и методы static в абстрактный класс, в который будут расширены ваши тесты.

Вот результат простого теста проекта, в который я помещаю код ответа и содержимое ответа в прослушиватель:

PHPUnit 7.5.8 by Sebastian Bergmann and contributors.

Testing Project Test Suite
int(200)
string(523) "<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Home</title>
            </head>
    <body>
        <div class="form">

    <form name="form" method="post">
        <div><label for="form_username" class="required">Username</label><input type="text" id="form_username" name="form[username]" required="required" /></div>
        <input type="hidden" id="form__token" name="form[_token]" value="2AsriLX8VMS0VqomR2wtTGk159TXMhYQJlPt_Chwtv8" />
    </form>
</div>
            </body>
</html>
"
F                                                                   1 / 1 (100%)

Time: 118 ms, Memory: 16.00 MB

There was 1 failure:

1) Tests\PHPUnit\YesWeHack\YWH_PGM5_1Test::testReportIsFixed
Failed asserting that 200 matches expected 500.

MyTest.php:29

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...