Как написать более элегантный юнит-тест для утверждения файла 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);
}
Как я могу сделать это лучше?Заранее спасибо!