如何使用PHPUnit测试精确的Exception消息而不是子字符串?

根据@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);
}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...