как проверить HEAD раздел содержит ссылку на CSS файл в условных комментариях - PullRequest
0 голосов
/ 27 января 2012

Как написать более элегантный юнит-тест для утверждения файла ie.css для определенных браузеров, добавлен в раздел head между условными комментариями:

  • порядок атрибутов может отличаться
  • пробелы могут быть по обе стороны от знака уравнения "="
  • тег закрывающей ссылки может быть> или />
  • Что, если между одними и теми же условными комментариями будет включено более одного файла?

Часть исходного кода html:

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <link href="/css/blueprint/screen.css" media="screen, projection" rel="stylesheet" type="text/css" />
        <!--[if lt IE 8]> <link href="/css/blueprint/ie.css" media="screen, projection" rel="stylesheet" type="text/css" /><![endif]-->

Мой тестовый класс расширяется от Zend_Test_PHPUnit_ControllerTestCase:

<?php
class BlueprintTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    public function setUp()
    {
        $this->bootstrap = new Zend_Application(APPLICATION_ENV,
                        APPLICATION_PATH . '/configs/application.ini');
        parent::setUp();
    }

Эта попытка не удалась ,аналогичный тест, утверждающий, что файл screen.css находится в разделе head, проходит:

/**
 * this test FAILS
 */
public function testBlueprintMSIEScreenCssIncluded()
{
    $this->dispatch('/');
    $xpath = '/html/head/link'
           . '[@rel="stylesheet"]'
           . '[@href="/css/blueprint/ie.css"]'
           . '[@type="text/css"]'
           . '[@media="screen, projection"]';
    $this->assertXpathCount($xpath, 1);
}

Наконец, я написал тест, который прошел, но он настолько «не красивый», что я действительно хотел бы узнать, какчтобы сделать это лучше:

/**
 * this test passes, but i do not like the way it is done:
 */
public function testBlueprintMSIECssIncludedUsingUglyLongGeneratedRegex()
{
    $this->dispatch('/');
    $p = array(
        'rel\s*=\s*"stylesheet"',
        'href\s*=\s*"/css/blueprint/ie\.css"',
        'type\s*=\s*"text/css"',
        'media\s*=\s*"screen, projection"'
    );
    $tmp = array();
    foreach($p as $a) {
        foreach($p as $b) {
            if($b == $a) continue;
            foreach($p as $c) {
                if($c == $a || $c == $b) continue;
                foreach($p as $d) {
                    if($d == $a || $d == $b || $d == $c) continue;
                    $tmp[] = "($a\s+$b\s+$c\s+$d)";
                }
            }
        }
    }

    $pattern = '#<!--\[if lt IE 8\]>[\s\n]*'
        . '<link\s+' . implode("|", $tmp) . '\s*[/]*>[\s\n]*'
        . '<!\[endif\]-->#im';
    $this->assertQueryContentRegex('html head', $pattern);
}

Как я могу сделать это лучше?Заранее спасибо!

...