是否可以在不扩展PHPUnit_Framework_TestCase的情况下使用PHPUnit断言?

qui*_*ram 4 php phpunit unit-testing symfony

也许这个问题很奇怪,但这是我要解决的问题......首先,请记住,我更像是一个习惯使用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");
Run Code Online (Sandbox Code Playgroud)

然后我为站点内的其他页面编写了更多的测试,并且在所有这些中我想测试标题是否应该是,所以为了能够重用代码我将上面的内容重构为父类中的一个函数测试类重用:

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");
}
Run Code Online (Sandbox Code Playgroud)

我在测试中称这种方法.随着测试的发展,我可以重构更多类似的"复杂断言",并且所有这些都会转到父类,从而使我的父类膨胀成一个庞大的断言容器:

protected function assertSelectedOptionContainsTextValue($selector, $text, $value, $crawler) {
    ...
}

protected function assertMenusContainItems($menus, $crawler) {
    ...
}

protected function assertErrorMessageShown($message, $crawler) {
    ...
}

... (more and more) ...
Run Code Online (Sandbox Code Playgroud)

你明白了.我在这一点上的下一个想法是将所有这些"复杂的断言"重构为其他类,可能遵循Page Object模式,但是其他类将无法访问该assertEquals方法,除非那些其他类也扩展WebTestCase或至少PHPUnit_Framework_TestCase,似乎不是一个好主意......

那么有一种简单的方法来访问assertEquals方法(和相关的),而无需扩展基础PHPUnit类?我可以用某种方式使用作文吗?

Seb*_*ann 12

PHPUnit的内置断言在PHPUnit_Framework_Assert类中实现为公共静态方法.PHPUnit_Framework_Assert::assertTrue()例如,只需调用它们即可.