gpt4 book ai didi

php - Laravel 资源 Controller 测试第二次给出 NotFoundHttpException

转载 作者:可可西里 更新时间:2023-10-31 23:04:38 26 4
gpt4 key购买 nike

我在使用 Laravel 4 进行测试时遇到了一件非常奇怪的事情。它看起来像是一个错误,但可能有一个合乎逻辑的解释。

我已经在干净的 Laravel 安装中复制了“错误”,这是我的代码:

我的资源 Controller /app/controllers/TestController.php:

(使用 php artisan controller:make TestController 创建)

class TestController extends \BaseController {

/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
return Response::json(array());
}

// The end of the file is unchanged

在我的 app/routes.php 中:

Route::get('/', function()
{
return View::make('hello');
});

// Note the composed part of the URL.
// My problem isn't present if I just use `myapi` or `path` as a url
Route::resource('myapi/path', 'TestController');

/app/test/ExampleTest.php中添加:

public function testTest()
{
$res = $this->call('GET', 'myapi/path');

// Until here everything works right
$this->assertEquals(json_decode($res->getContent()), array());

// Now I call the same URL a second time
$res = $this->call('GET', 'myapi/path');

$this->assertEquals(json_decode($res->getContent()), array());
}

现在我运行 phpunit,这是我得到的结果:

There was 1 error:

1) ExampleTest::testTest
Symfony\Component\HttpKernel\Exception\NotFoundHttpException:

/home/me/Web/laraveltest/bootstrap/compiled.php:5531
/home/me/Web/laraveltest/bootstrap/compiled.php:4848
/home/me/Web/laraveltest/bootstrap/compiled.php:4836
/home/me/Web/laraveltest/bootstrap/compiled.php:4828
/home/me/Web/laraveltest/bootstrap/compiled.php:721
/home/me/Web/laraveltest/bootstrap/compiled.php:702
/home/me/Web/laraveltest/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php:81
/home/me/Web/laraveltest/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php:332
/home/me/Web/laraveltest/vendor/laravel/framework/src/Illuminate/Foundation/Testing/ApplicationTrait.php:51
/home/me/Web/laraveltest/app/tests/ExampleTest.php:25

在我的另一个项目中,我得到了一个稍微不同的回溯,但我的印象是同样的问题:(但我不知道为什么另一个被编译而这个没有)

2) UnitModelTest::testOther
Symfony\Component\HttpKernel\Exception\NotFoundHttpException:

/home/me/Web/my-project/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php:148
/home/me/Web/my-project/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1049
/home/me/Web/my-project/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1017
/home/me/Web/my-project/vendor/laravel/framework/src/Illuminate/Routing/Router.php:996
/home/me/Web/my-project/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:775
/home/me/Web/my-project/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:745
/home/me/Web/my-project/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php:81
/home/me/Web/my-project/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php:327
/home/me/Web/my-project/vendor/laravel/framework/src/Illuminate/Foundation/Testing/ApplicationTrait.php:51
/home/me/Web/my-project/app/tests/UnitModelTest.php:32

在这两种情况下,测试文件跟踪中给出的行对应于测试的第二个 调用

正如我在 routes.php 文件的注释中指出的那样,如果我使用一个没有斜线的简单 url,测试将毫无问题地通过。

我在浏览器中使用 api 时没有问题。

我在 StackOverflow 上发现了许多与 NotFoundHttpException 相关的主题,但没有一个与我的相似。这个专门在测试时出现,只在第二次调用时触发错误。

那么我在这里做错了什么?或者它真的是一个错误?

最佳答案

问题是使用同一客户端进行的调用 将相对使用所提供的 URI。这意味着您实际调用的是:

  1. myapi/路径
  2. myapi/myapi/路径

如果您在 url 前添加一个 / 使它们绝对到应用程序的根目录,则可以解决此问题。

public function testTest()
{
$res = $this->call('GET', '/myapi/path');

// Until here everything works right
$this->assertEquals(json_decode($res->getContent()), array());

// Now I call the same URL a second time
$res = $this->call('GET', '/myapi/path');

$this->assertEquals(json_decode($res->getContent()), array());
}


如果您遇到其他类似问题,通常可以调用

$this->refreshApplication();

(这也将创建一个新的客户端,因此也解决了这个问题)

关于php - Laravel 资源 Controller 测试第二次给出 NotFoundHttpException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com