Функциональный тест Symfony2 - проверьте содержимое таблицы


Я только когда-либо использовал такие вещи, как contains() в своих утверждениях, поэтому я не уверен, как бы я поступил с чем-то таким сложным, как это.

Допустим, у меня есть множество ожидаемых ответов - в данном случае это ДА, ДА, НЕТ.

Таким образом, это фактически означает, что для первого и второго вопроса я ожидал бы увидеть <span class="glyphicon glyphicon-ok"></span> внутри третьего <td>, а для третьего вопроса я ожидал бы увидеть его внутри четвертого <td>.

Вот мой HTML-код:

<table class="table table-curved">
    <tr>
        <th width="10%">Item</th>
        <th width="60%">Description</th>
        <th width="10%">YES</th>
        <th width="10%">NO</th>
        <th width="10%">NOT APPLICABLE</th>
    </tr>

    <tr>
        <td class="report-table-inner report-centre">1</td>
        <td class="report-table-inner">Check cargo is secure and undamaged.</td>
        <td class="report-centre success"><span class="glyphicon glyphicon-ok"></span></td>
        <td class="report-centre"></td>
        <td class="report-centre"></td>
    </tr>
    <tr>
        <td class="report-table-inner report-centre">2</td>
        <td class="report-table-inner">Is all cargo accounted for.</td>
        <td class="report-centre success"><span class="glyphicon glyphicon-ok"></span></td>
        <td class="report-centre"></td>
        <td class="report-centre"></td>
    </tr>
    <tr>
        <td class="report-table-inner report-centre">3</td>
        <td class="report-table-inner">Is all cargo checked by customs.</td>
        <td class="report-centre"></td>
        <td class="report-centre danger"><span class="glyphicon glyphicon-ok"></span></td>
        <td class="report-centre"></td>
    </tr>
    ...

Как мне следует писать испытание для этого? Сложно ли программно перебирать <tr>?

Спасибо

Author: rolebi, 2015-08-07

3 answers

Обратите внимание, что я вообще не использую Symfony, но вот ответ, в котором используется чистый PHP DOM; ему нужны значения $ в виде массива либо с "пропуском" (чтобы пропустить этот <tr>), либо с индексом, в столбце которого должен быть класс glyphicon-ok:

<?php
$data = <<<DATA
<table class="table table-curved">
    <tr>
        <th width="10%">Item</th>
        <th width="60%">Description</th>
        <th width="10%">YES</th>
        <th width="10%">NO</th>
        <th width="10%">NOT APPLICABLE</th>
    </tr>

    <tr>
        <td class="report-table-inner report-centre">1</td>
        <td class="report-table-inner">Check cargo is secure and undamaged.</td>
        <td class="report-centre success"><span class="glyphicon glyphicon-ok"></span></td>
        <td class="report-centre"></td>
        <td class="report-centre"></td>
    </tr>
    <tr>
        <td class="report-table-inner report-centre">2</td>
        <td class="report-table-inner">Is all cargo accounted for.</td>
        <td class="report-centre success"><span class="glyphicon glyphicon-ok"></span></td>
        <td class="report-centre"></td>
        <td class="report-centre"></td>
    </tr>
    <tr>
        <td class="report-table-inner report-centre">3</td>
        <td class="report-table-inner">Is all cargo checked by customs.</td>
        <td class="report-centre"></td>
        <td class="report-centre danger"><span class="glyphicon glyphicon-ok"></span></td>
        <td class="report-centre"></td>
    </tr>
</table>
DATA;


$dom = new DOMDocument();
$dom->loadXML($data);
$xpath = new DOMXPath($dom);
$values = ['pass', 2, 2, 3];
$idx = 0;
foreach($xpath->query('//tr') as $tr) {
  if ($values[$idx] != 'pass') {
    $tds = $tr->getElementsByTagName('td');
    $td = $tds->item($values[$idx]);
    if ($td instanceof DOMNode && $td->hasChildNodes()) {
      if (FALSE !== strpos($td->firstChild->getAttribute('class'), 'glyphicon-ok')) {
          echo "Matched on ", $tds->item(1)->textContent, "\n";
      } else {
          echo "Not matched on ", $tds->item(1)->textContent, "\n";
      }
    }
  }
  ++$idx;
}
 1
Author: TML, 2015-08-12 03:09:02

Я думаю, вам следует посмотреть страницу документации о тестировании и компоненте DomCrawler:

Существуют очень простые методы, которые могут фильтровать содержимое html или xml.

 2
Author: xurshid29, 2015-08-07 05:36:16

Ссылки:


<?php

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class PageTest extends WebTestCase
{
    public function testPage()
    {
        // create a client to get the content of the page
        $client = static::createClient();
        $crawler = $client->request('GET', '/page');

        // retrieve table rows
        $rows = $crawler->filter('.table-curved tr');

        $statesColumnIndex = array(
            // 0 indexed
            'ok' => 2,
            'ko' => 3,
            'na' => 4,
        );

        $expectedValues = array(
            // 0 indexed, row index => [$values]
            1 => ['identifier' => 1, 'state' => 'ok'],
            2 => ['identifier' => 2, 'state' => 'ok'],
            3 => ['identifier' => 3, 'state' => 'ko'],
        );

        foreach ($expectedValues as $rowIndex => $values) {
            // retrieve columns for row
            $columns = $rows->eq($rowIndex)->filter('td');

            // check item identifier
            $identifierColumn = $columns->eq(0);
            $this->assertEquals(
                (string) $values['identifier'],   
                trim($identifierColumn->text())
            );

            // check state
            $stateColumn = $columns->eq($statesColumnIndex[$values['state']]);
            $this->assertEquals(1, $stateColumn->filter('.glyphicon-ok')->count());
        }
    }
}

 2
Author: rolebi, 2015-08-12 09:45:40