【问题标题】:Laravel TestCase can't run the next requestLaravel TestCase 无法运行下一个请求
【发布时间】:2014-06-18 16:54:50
【问题描述】:

我正在尝试测试我的 Laravel 控制器,但第二次发出请求:

$this->call('GET', "api/school");

总是返回:

Symfony\Component\HttpKernel\Exception\NotFoundHttpException: 

但第一次还好。我可以在我的测试方法中多次调用$this->call 吗?如果是这种情况,我不想复制代码,有没有办法像 Rspec 上下文一样嵌套测试代码?

【问题讨论】:

    标签: php laravel phpunit


    【解决方案1】:

    您的第二个通话地址已附加到第一个通话地址。

    $this->call()Symfony\Component\BrowserKit\Client 中调用方法request(),而后者又调用getAbsoluteUri()

    有趣的是getAbsoluteUri() 使您的测试第二次调用/api/school/api/school。这是symfony's source code中getAbsoluteUri()的描述。

    获取一个 URI,如果它还不是绝对的,则将其转换为绝对。

    从源代码来看,它似乎需要您之前的调用,如果您的第二个请求已经不是绝对 URI,则将新的附加到它。

    所以要解决这个问题,您必须确保 call() 已经获取了您的绝对 URI,只需执行以下操作:

     $this->call('GET', "/api/school");
    

    【讨论】:

    • 感谢您提供非常详细和有用的答案。我不确定这是预期的行为还是错误。
    • @randomor 我会说这是预期的行为。 Laravel 使用的 BrowserKit 客户端实际上将自己模拟为一个 Web 浏览器。同样,如果您在浏览器中打开http://yourweb.com/api/school,然后单击<a href="api/school">,它会将您发送到http://yourweb.com/api/school/api/school。 (之前不知道小$this->call()也这么厉害!)
    猜你喜欢
    • 2023-04-02
    • 2019-10-03
    • 1970-01-01
    • 2016-01-09
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多