Как я могу создать PHPUnit assertTag () для соответствия таблицам HTML, как это? - PullRequest
1 голос
/ 13 сентября 2011

Я пытаюсь проверить, что таблица HTML имеет заданный идентификатор и имеет 2 строки, каждая из которых содержит 4 ячейки.

Это определение соответствия, которое я пробовал, насколько я могускажите, должно работать:

$matcher = array(
    'tag' => 'table',
    'attributes' => array('id' => 'peopleLarge'),
    'children' => array(
        'count' => 2,
        'only' => array(
            'tag' => 'tr',
            'children' => array(
                'count' => 4,
                'only' => array(
                    'tag' => 'td'
                )
            )
        )
    )
);

$this->assertTag($matcher, $sOutput);

Вывод, который проверяется на:

<table id="peopleLarge">
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
    </tr>
</table>

Однако этот тест всегда не удается.

Я предполагаю, что я 'неправильно пишу определение соответствия, так что может ли кто-нибудь, кто знает больше о PHPUnit, чем я, протянуть мне руку помощи?

Вывод из PHPUnit выглядит следующим образом:

PHPUnit_Framework_ExpectationFailedException : Failed asserting that <boolean:false> is true.
#0 C:\wamp\bin\php\php5.3.0\PEAR\PHPUnit\Framework\Assert.php(2087): fail()
#1 C:\wamp\bin\php\php5.3.0\PEAR\PHPUnit\Framework\Assert.php(756): assertThat()
#2 C:\wamp\bin\php\php5.3.0\PEAR\PHPUnit\Framework\Assert.php(2048): assertTrue()
#3 C:\_company\t\timeforchildren\webroot\tests\app\views\People_View_LargeTest.php(93): assertTag()
#4 C:\wamp\bin\php\php5.3.0\PEAR\PHPUnit\Framework\TestCase.php(738): invokeArgs()
#5 C:\wamp\bin\php\php5.3.0\PEAR\PHPUnit\Framework\TestCase.php(628): runTest()
#6 C:\wamp\bin\php\php5.3.0\PEAR\PHPUnit\Framework\TestResult.php(666): runBare()
#7 C:\wamp\bin\php\php5.3.0\PEAR\PHPUnit\Framework\TestCase.php(576): run()
#8 C:\wamp\bin\php\php5.3.0\PEAR\PHPUnit\Framework\TestSuite.php(757): run()
#9 C:\wamp\bin\php\php5.3.0\PEAR\PHPUnit\Framework\TestSuite.php(733): runTest()
#10 C:\wamp\bin\php\php5.3.0\PEAR\PHPUnit\TextUI\TestRunner.php(305): run()
#11 C:\Users\Nils\AppData\Local\Temp\phpunit_webroot_Nils.php(485): doRun()
#12 C:\Users\Nils\AppData\Local\Temp\phpunit_webroot_Nils.php(750): runTest()
#13 C:\Users\Nils\AppData\Local\Temp\phpunit_webroot_Nils.php(853): main()

Большое спасибо,

Ответы [ 2 ]

3 голосов
/ 09 августа 2012

Да, вывод assertTag () воняет.

Я бы порекомендовал разбить это на несколько утверждений и / или тестов. Я думаю, что причина того, что вы получаете ошибку, в том, что она запуталась в строке 'count' => 4.

Хорошая техника, которую я нашел, - это постепенное создание массива $matcher, и когда вы получаете ошибку, это проблема. И наоборот, вы можете написать все это, затем закомментировать все это и постепенно удалять комментарии.

Когда эта конкретная строка закомментирована, утверждение успешно выполняется. Когда это не комментируется, я получаю ту же ошибку, что и вы.

Вот странная часть: если вы введете значение другое , отличное от 4, например 5, вы получите другую ошибку:

Invalid argument supplied for foreach()

Я думаю, что это может сбить с толку, потому что вы считаете детей (внуков, если хотите), когда число детей равно > 1. Я пытался использовать значение "8", потому что технически Ваш HTML содержит 8 td, которые являются дочерними элементами tr, но это показало ошибку foreach ().

Предложения:

  1. Разбейте на несколько утверждений и / или тестов. Возможно, отдельное утверждение на основе регулярных выражений для подтверждения подсчета различных элементов и иерархии?

  2. Совет, больше, чем предложение: делать не нужно

    'attributes' => array('id' => 'peopleLarge'),
    

    Вместо этого вы можете просто сделать:

    'id' => 'peopleLarge',
    

    (ID сам по себе является критерием для assertTag ())

2 голосов
/ 02 января 2013

Я обычно добавляю несколько пользовательских совпадений, используя xpath.Эти пользовательские сопоставления могут иметь больше описательных сообщений.

В вашем случае

private function assertHasXpath($xpath, $message = '', $group = 'Other') {
  if (empty($message)) {
    $message = "xpath '{$xpath}' not found.";
  }
  $xpath = $this->xpath($xpath);
  $truthiness = count($xpath) > 0;
  return $this->assertTrue($truthiness, $message, $group);
}

private function assertHasTableWithColumns($amount_columns, $message = '', $group = 'Other') {
  $xpath = "//*//table/tr/td";
  $amount_found = count($this->xpath($xpath))

  if (empty($message)) {
    $message = "No table with {$amount_columns} found. Found {$amount_found}";
  }
  return $this->assertTrue(($amount_found == $amount_columns), $message, $group);
}

Затем вы можете написать очень наглядные и удобочитаемые тесты (то есть, какими тестами должны быть все).

public function testHasTitleWithPeople() {
  $this->drupalGet("people");
  $this->assertHasXpath("//*/h2[@class='title'][contains(text(),'People')]");
  // This pattern is complex enough to warrant its own assertTitleWithContent($content)

}

public function testRendersTable() {
  $this->drupalGet("people");
  $this->assertHasTableWithColumns(4);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...