相关疑难解决方法(0)

单元测试Laravel的FormRequest

我正在尝试对各种自定义FormRequest输入进行单元测试.我找到了解决方案:

  1. 建议使用该$this->call(…)方法并response使用期望值断言(链接到答案).这是过度的,因为它直接依赖于路由控制器.

  2. 泰勒的测试,从Laravel框架 中发现的 tests/Foundation/FoundationFormRequestTest.php.那里有很多嘲弄和开销.

我正在寻找一种解决方案,我可以根据规则对各个字段输入进行单元测试(独立于同一请求中的其他字段).

SampleRequest示例:

public function rules()
{
    return [
        'first_name' => 'required|between:2,50|alpha',
        'last_name'  => 'required|between:2,50|alpha',
        'email'      => 'required|email|unique:users,email',
        'username'   => 'required|between:6,50|alpha_num|unique:users,username',
        'password'   => 'required|between:8,50|alpha_num|confirmed',
    ];
}
Run Code Online (Sandbox Code Playgroud)

期望的测试:

public function testFirstNameField()
{
   // assertFalse, required
   // ...

   // assertTrue, required
   // ...

   // assertFalse, between
   // ...
}

public function testLastNameField()
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我如何单独测试(断言)每个字段的每个验证规则?

php unit-testing request laravel laravel-5.2

18
推荐指数
3
解决办法
5914
查看次数

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

按照PHPUnit文档@expectedExceptionMessage,字符串只能是实际的子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)));
    }
}
Run Code Online (Sandbox Code Playgroud)

我这里的问题是,在PHPUnit测试方法中,我检查了不同的组合。这导致测试通过,我打算失​​败。

/**
 * @expectedException \Exception
 * @expectedExceptionMessage a < b.
 */
public function testValues_ALessBOnly()
{
    $myClass = new MyClass()
    $myClass->validate(1, 2, 4, 3);
}
Run Code Online (Sandbox Code Playgroud)

Exception消息的字符串实际上是, …

php phpunit unit-testing exception-handling php-5.3

6
推荐指数
3
解决办法
5010
查看次数