【发布时间】:2015-03-22 20:05:02
【问题描述】:
也许这个问题看起来很奇怪,但这是我要解决的问题...首先,请记住,我更像是一个习惯于使用 PHP 的 Java 开发人员,所以也许问题是我的思维过程!
我正在测试一个使用 Symfony 构建的网站。对于我的组件测试,我创建了扩展 WebTestCase 的测试类,并且我的测试有一组如下断言来验证页面标题是否在我想要的位置并包含我期望的内容:
$text = "Page Title";
$selector = "h2#pageHeading";
$this->assertEquals(1, $crawler->filter($selector)->count(), "Found wrong number of elements using selector ".$selector);
$this->assertEquals(trim($text),
trim($crawler->filter($selector)->text()),
"Element $selector didn't have expected text");
然后我为站点中的其他页面编写更多测试,并且在所有这些中我想测试标题是否应该存在,所以为了能够重用代码,我将上面的代码重构为父类中的一个函数其他测试类重用:
function assertPageTitle($text) {
$selector = "h2#pageHeading";
$this->assertEquals(1, $crawler->filter($selector)->count(), "Found wrong number of elements using selector ".$selector);
$this->assertEquals(trim($text),
trim($crawler->filter($selector)->text()),
"Element $selector didn't have expected text");
}
我在测试中调用了该方法。随着测试的发展,我可以重构更多类似的“复杂断言”,所有这些都转到父类,从而将我的父类膨胀成一个庞大的断言容器:
protected function assertSelectedOptionContainsTextValue($selector, $text, $value, $crawler) {
...
}
protected function assertMenusContainItems($menus, $crawler) {
...
}
protected function assertErrorMessageShown($message, $crawler) {
...
}
... (more and more) ...
你明白了。在这一点上,我的下一个想法是将所有这些“复杂断言”重构到其他类中,可能遵循Page Object 模式,但是其他类将无法访问assertEquals 方法,除非那些其他类也扩展@ 987654328@或至少PHPUnit_Framework_TestCase,这似乎不是一个好主意...
那么有没有一种简单的方法来访问assertEquals 方法(和相关的)而无需扩展基本的PHPUnit 类?我可以以某种方式使用组合吗?
【问题讨论】:
-
如果你想测试你的 UI 代码,你真的应该使用 selenium。 phpunit.de/manual/current/en/selenium.html
-
我不太确定我是否同意这一点。 Selenium 缓慢且易碎,很容易因神秘原因而失败。我们在 PHP 测试无法达到的地方使用 Selenium,但仅此而已。
标签: php unit-testing symfony phpunit