根据@expectedExceptionMessage上的PHPUnit Documentation,字符串必须只是抛出的实际Exception的子字符串.
在我的一个验证方法中,为每个发生的错误推送一个数组项,并通过触发错误数组来显示最终的Exception消息.
class MyClass
{
public function validate($a, $b, $c, $d)
{
if($a < $b) $errors[] = "a < b.";
if($b < $c) $errors[] = "b < c.";
if($c < $d) $errors[] = "c < d.";
if(count($errors) > 0) throw new \Exception(trim(implode(" ", $errors)));
}
}
我在这里遇到的问题是在PHPUnit测试方法中我检查了不同的组合.这导致测试通过我打算失败.
/**
* @expectedException \Exception
* @expectedExceptionMessage a < b.
*/
public function testValues_ALessBOnly()
{
$myClass = new MyClass()
$myClass->validate(1, 2, 4, 3);
}
Exception消息的字符串实际上是“a< b.b< c”.但这个测试仍然通过.我打算让这个测试失败,因为这个消息并不完全符合我的预期. 有没有办法让PHPUnit期望一个精确的字符串,而不是一个子字符串?我希望避免以下情况:
public function testValues_ALessBOnly()
{
$myClass = new MyClass()
$fail = FALSE;
try
{
$myClass->validate(1, 2, 4, 3);
}
catch(\Exception $e)
{
$fail = TRUE;
$this->assertEquals($e->getMessage(), "a < b.";
}
if(!$fail) $this->fail("No Exceptions were thrown.");
}
解决方法:
发布此问题时,PHPUnit v3.7没有解决此问题的方法.较新的版本有一个新的@expectedExceptionMessageRegExp
选项,您可以使用它来添加正则表达式以匹配异常消息.
您的情况,使用^
and $
强制字符串完全符合预期,可能如下所示:
/**
* @expectedException \Exception
* @expectedExceptionMessageRegExp /^a < b\.$/
*/
public function testValues_ALessBOnly()
{
$myClass = new MyClass()
$myClass->validate(1, 2, 4, 3);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。