也许这个问题很奇怪,但这是我要解决的问题...首先,请记住,我更像是一个习惯使用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
方法,除非那些其他类课程也延伸WebTestCase
或至少PHPUnit_Framework_TestCase
,这似乎不是一个好主意......
那么有一种简单的方法可以访问assertEquals
方法(和相关的)而无需扩展基础PHPUnit类吗?我能以某种方式使用作文吗?
答案 0 :(得分:12)
PHPUnit的内置断言在PHPUnit_Framework_Assert
类中实现为公共静态方法。例如,只需将它们调用为PHPUnit_Framework_Assert::assertTrue()
。
答案 1 :(得分:2)
首先,你在“通用”函数的开头覆盖$ text变量 - 但我知道你只想表现出想法。
其次,对这种测试使用单元测试并不是最好的选择。我认为您应该将标题的逻辑提取到分离的类中,然后通过PHPUnit进行测试或使用更合适的测试解决方案,如Behat或Selenium。
如果您仍然没有改变您的意见......每当您想使用PHPUnit进行测试时,您必须至少延长PHPUnit_Framework_TestCase
。
小提示:提取你的断言会很好。
答案 2 :(得分:0)
为了在trait中创建可重用的phpunit断言。这可以在许多测试案例中使用。您可以使用静态调用PHPUnit_Framework_Assert::assertSame
的特征,快速示例如何实现它:
<?php
namespace Tests\Foo;
use PHPUnit_Framework_Assert;
trait AssertTrait
{
public function assertInTraitAlwaysFailing()
{
PHPUnit_Framework_Assert::assertSame(1, 2, 'always failing');
}
}
它可以作为帮助程序,可以在需要相同断言的许多地方使用,以防止重复。