- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我为自己创建了一个自定义 PHPUnit 约束并将其连接到一个不错的 assert...
函数。
我将它放入我的基本 TestCase
中,它是 assertLastError
函数:
/**
* abstract, base test-case class.
*/
abstract class TestCase extends \PHPUnit_Framework_TestCase
{
/**
* assert lint of a php file
*/
protected function assertLint($filename, $message = '') {
self::assertThat($filename, new ConstraintLint, $message);
}
/**
* assert the last error
*/
protected function assertLastError($error, $file, $message = '') {
self::assertThat($file, new ConstraintLastError($error), $message);
}
/**
* assert XML DTD validity
*/
protected function assertXmlStringValidatesDtdUri($xml, $dtd, $message = '') {
self::assertThat($dtd, new ConstraintXmlStringValidatesDtdUri($xml), $message);
}
...
到目前为止,我已经调试了约束,我看到 evaluate
方法被调用并返回 FALSE
,但是测试运行器没有向我报告失败。
约束条件:
/**
* ConstraintLastError
*
* For asserting the last error message in a file.
*
* To test trigger_error().
*
* Example:
*
* $this->assertLastError('Error Message', 'basenameOfFile.php');
*
*/
class ConstraintLastError extends \PHPUnit_Framework_Constraint {
private $file;
private $error;
public function __construct($error) {
$this->error = $error;
}
/**
* Evaluates the constraint for parameter $file. Returns TRUE if the
* constraint is met, FALSE otherwise.
*
* @param string $file Value or object to evaluate.
* @return bool
*/
public function evaluate($file)
{
$this->file = $file;
$error = $this->error;
$lastError = error_get_last();
if (NULL === $lastError)
return false;
$last_message = $lastError['message'];
$last_file = $lastError['file'];
$result = ($error == $last_message && basename($file) == basename($last_file));
var_dump($result, $error, $last_message, $file, $last_file);
return $result;
}
/**
* @param mixed $other
* @param string $description
* @param boolean $not
*/
protected function customFailureDescription($other, $description, $not)
{
return sprintf('Failed asserting that the last error %s', basename($other), $not ? '' : 'no ', implode("\n - ", $this->lines));
}
/**
* Returns a string representation of the constraint.
*
* @return string
*/
public function toString()
{
return sprintf('was %s in file %s.', $this->error, $this->file);
}
}
我不知道为什么它停止工作,测试用例刚刚干净地完成,我可以在输出中看到错误消息,包括。堆栈跟踪(xdebug 已打开)和 var_dump
告诉我结果是 FALSE
。这是测试:
public function testGetType()
{
...
$fragment->setParsed(array());
\PHPUnit_Framework_Error_Warning::$enabled = FALSE;
$actual = $fragment->getType();
\PHPUnit_Framework_Error_Warning::$enabled = TRUE;
$this->assertLastError('Invalid State Error FAIL', 'Fragment.php');
}
这是我刚刚写的一个新测试,我在其他地方也有同样的断言,但它们不再有效。
PHPUnit 3.6.7
最佳答案
我现在可以解决这个问题。这与我升级了 PHPUnit 有关,API 略有变化。我再次将 PHPUnit_Framework_Constraint
作为我自己约束的模式,阅读其中的评论会有所帮助。
evaluate
函数现在有所不同,我现在将评估逻辑移到了一个私有(private)函数中,并从 evaluate
切换到了 matches
。它与返回值一起使用。 evaluate
默认情况下不再使用返回值,但会抛出异常。要从中充分受益,您还可以实例化一些比较器对象,但这超出了我的理解范围,您可以在 asserEquals
约束中找到更多相关信息。
class ConstraintLastError extends \PHPUnit_Framework_Constraint {
...
/**
* Evaluates the constraint for parameter $file. Returns TRUE if the
* constraint is met, FALSE otherwise.
*
* This method can be overridden to implement the evaluation algorithm.
*
* @param mixed $other Value or object to evaluate.
* @return bool
*/
public function matches($file)
{
return $this->compareAgainstLast($file, $this->error);
}
/**
*
* @param string $file
* @param string $error
* @return bool
*/
private function compareAgainstLast($file, $error)
{
if (!$last = error_get_last())
{
$last = array('message' => '(none)', 'file' => '');
}
$this->lastError = $last['message'];
$this->lastFile = $last['file'];
return $error === $this->lastError && basename($file) === basename($this->lastFile);
}
/**
* @param string $file
*/
protected function failureDescription($file)
{
return sprintf('the last error is "%s" in %s, was "%s" in %s'
, $this->error, basename($file)
, $this->lastError, basename($this->lastFile)
);
}
...
它现在就像一个魅力:
1) FragmentTest::testGetType
Failed asserting that the last error is "Suboptimal State Error" in Fragment.php, was "Invalid State Error" in Fragment.php.
其他人也有类似的问题,但切换到 fail
的解决方案不同,您也可以调用它,因为它是在基类中实现的 Phake Fixes issues #43 and #44 .
关于php - 自定义 PHPUnit 约束停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9456884/
我可以在所有 PHPUnit 测试完成后自动运行 PHP 脚本吗? 我想在所有测试完成后报告一些非致命问题(即正确但次优的测试结果)。 最佳答案 假设您可以检测到此类次优结果,PHPUnit(v9 及
假设我要测试三种状态下的数据库一致性: 插入数据后 - 我想确保已将一定数量的行插入到数据库表中。 当数据更新后-我想重复行数量测试(数量必须与插入后相同) 删除数据时 - 我想确保所有数据都已删除。
在 pear.phpunit.de/PHPUnit 中安装 PHPUnit 未知 channel pear.phpunit.de 时出错 无效的包名称/包文件 "Debian-4 操作系统上的 pea
谁能给我解释一下使用名为 phpunit.xml.dist 或 phpunit.xml 的 PHPunit 配置文件有什么区别。 official documentation提到两个名字: PHPUn
如果我只想使用来自数据提供者的一个数据运行测试,我该怎么做? 我在这个线程上尝试了解决方案,但没有奏效 Cannot run single test with data provider in PHP
如何编写自定义断言,例如 assertFoo($expected, $actual) ,它的行为类似于关于错误“堆栈跟踪”的内置断言? 我目前定义了以下方法(在扩展 PHPUnit_Framework
我想在我的 Windows 服务器上安装 PHPUnit 3.7。我遵循了各种说明 here并以 PHPUnit 3.4.1 结束。当我尝试使用以下方法再次安装它时: pear update chan
我尝试在 PhpUnit 的 WebTestCase 中发送原始数据,但它不起作用: $jsonEvent = '{ "type": "invoice.payment_succeeded"
我收到了 PHPUnit 错误的代码覆盖率报告,我相信这是 XDebug 的一个错误。 如何配置 PHPUnit 以使用 one of its other drivers ,即PHPDBG? (我使用
我正在我的第一个项目中使用 PHPUnit 进行单元测试。事情进展顺利;但是,我已经开始通过最近的测试获得以下输出: .........................................
我刚刚学习如何使用 PHPUnit。我从命令行运行它,在结果中我得到OK,但是有问题!测试:5,断言:15,警告:2,弃用:5。 我不知道如何让它解释导致弃用和警告计数的原因。 如何找出测试代码中导致
是否有比 $this->assertTrue(false) 更官方的方法来强制 phpunit 失败? 最佳答案 我相信这应该在测试用例中起作用: $this->fail('Message'); 关于
我正在尝试为我的 Silex 应用程序编写一些测试,但遇到了问题。 我有以下 phpunit.xml 文件 ./
目前,我正在尝试使用命令行 phpunittests/Unit/ExampleTest 在 Laravel 项目上使用 phpunit 运行一些简单的单元测试。但它只运行第一种方法。有人有解决办法吗?
我的一些测试用例使用自定义测试库。而且这些测试用例非常慢。所以我想只在构建服务器中运行它们,而不是在我的本地服务器中运行它们。我想在本地运行其他测试。 以下是目录结构。 slow 目录中的那些是应该排
我有以下测试/文件夹: tests/ ClassOne.test.php ClassTwo.test.php ClassThree.test.php 我必须将以下 setUp() 和
我使用 phpunit 的测试套件功能来组织我的测试。我这样做是为了以后能够并行运行测试。 对于不同的目录,这是相对直接的。例如,我可以按捆绑拆分测试套件。 tests/BundleOne
我必须用内部数组测试一个数组。 我的数组如下所示。 $testdata=Array ( [0] => Array ( [
问题:为什么 PHPUnit 似乎在严格模式下运行? 问题: PHPUnit 4.3.1 by Sebastian Bergmann. Configuration read from /full/pa
我已经通过 Composer 安装了 PHPUnit,并将其设置为通过设置运行单元测试。 但是当我运行测试时,测试报告器出现以下错误(tets 执行得很好): Unable to attach tes
我是一名优秀的程序员,十分优秀!