【问题标题】:How to test form request rules in Laravel 5?如何在 Laravel 5 中测试表单请求规则?
【发布时间】:2015-06-29 22:23:28
【问题描述】:

我创建了一个表单请求类并定义了一堆规则。现在我想测试这些规则,看看行为是否符合我们的预期。

我怎样才能写一个测试来完成它?

非常感谢您的回答!

更新:更准确地说,我想编写一个单元测试来检查例如格式错误的电子邮件是否通过验证。问题是我不知道如何创建一个带有虚假输入的新请求实例。

【问题讨论】:

标签: forms unit-testing laravel testing request


【解决方案1】:

你需要在控制器函数中有你的表单请求类,例如

public function store(MyRequest $request)

现在创建 HTML 表单并尝试用不同的值填充它。如果验证失败,您将在会话中收到消息,如果验证成功,则进入控制器功能。

当单元测试时,然后调用 url 并将测试值添加为数组。 Laravel doc 说可以这样做

$response = $this->call($method, $uri, $parameters, $cookies, $files, $server, $content);

【讨论】:

  • 您好,感谢您的回答!不过,这并不是我真正想到的:s 我认为我的问题写得相当糟糕,所以我更新了它。我正在尝试做的是编写一个单元测试来检查我编写的验证规则是否正确。
  • 也改进了我的回答
  • 这似乎有点做作。你不应该只关注 Request 对象而不依赖于 URI、cookie 等吗?
  • @DovBenyominSohacheski 虽然该方法是“有效的”,但它绝对不是最佳实践。正如你所说,当单元测试时,除了被测试的类/函数之外的所有东西都应该被模拟/存根
  • @Juan 检查此链接以获得不同的解决方案:stackoverflow.com/a/37096837/5058871
【解决方案2】:

接受的答案同时测试授权和验证。如果你想单独测试这些功能,那么你可以这样做:

测试rules():

$attributes = ['aa' => 'asd'];
$request = new MyRequest();
$rules = $request->rules();
$validator = Validator::make($attributes, $rules);
$fails = $validator->fails();
$this->assertEquals(false, $fails);

测试authorize():

$user = factory(User::class)->create();
$this->actingAs($user);
$request = new MyRequest();
$request->setContainer($this->app);
$attributes = ['aa' => 'asd'];
$request->initialize([], $attributes);
$this->app->instance('request', $request);
$authorized = $request->authorize();
$this->assertEquals(true, $authorized);

您应该在基类中创建一些辅助方法来保持测试 DRY。

【讨论】:

  • 根据您的验证逻辑有多复杂(例如,如果您通过 Request 类中的代码组装 rules 数组),您需要分配您的 $attributes在创建 Request 对象后添加此行,将数组添加到您的自定义 Request 类中:$request->replace($attributes);
  • 我无法理解您在单元测试中如何导入 Validator。这是一个门面类,对吧?
  • @Zac:是的,你是对的。您需要从 Illuminate\Support\Facades\Validator 导入 Validator。
【解决方案3】:

这是测试验证的完整示例:

use App\Http\Requests\PostRequest;
use Illuminate\Routing\Redirector;
use Illuminate\Validation\ValidationException;

class PostRequestTest extends TestCase
{
    protected function newTestRequest($data = [])
    {
        $request = new PostRequest();

        $request->initialize($data);

        return $request
            ->setContainer($this->app)
            ->setRedirector($this->app->make(Redirector::class));
    }

    public function testValidationFailsWhenEmptyTitleIsGiven()
    {
        $this->expectException(ValidationException::class);

        $this->newTestRequest(['title' => ''])->validateWhenResolved();
    }
}

【讨论】:

  • Steve 总是这样一个球手……正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 2015-08-05
  • 2018-05-18
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2021-01-02
  • 2015-07-15
  • 2017-06-13
相关资源
最近更新 更多