Laravel API 发送带有 JSON 负载的请求后调用测试中断
Laravel API call tests break after sending request with JSON payload
我正在尝试 运行 Laravel 测试中的一系列 API 调用,但由于某种原因,调用 POST 方法时会破坏测试对象的状态根据 test class
文档的默认值
$userData = json_encode([
'username' => 'Bender',
'password' => 'CorrectHorseBatteryStaple123#',
'questions' => ['What is the airspeed of unladen swallow?'],
'answers' => ['African or european?'],
]);
$response1 = $this->call('GET', 'languages');
echo $response1;
$response = $this->call('POST', 'accounts/create',array(),array(),array(),$userData);
echo $response;
$this->assertResponseOk();
$response1 = $this->call('GET', 'languages'); //this is line 30
echo $response1;
$this->assertResponseOk();
第一个 GET 调用,POST 调用正常完成,return 预期结果。但是第二次 GET 调用失败。 (GET 和 POST 调用涉及代码和数据库的完全不同部分,不应相互影响。)
我得到的错误是
1) Project\Test\AccountsTest::testSample
Symfony\Component\HttpKernel\Exception\NotFoundHttpException:
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php:148
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1054
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1022
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1001
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:775
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:745
/var/www/project/project-backend/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php:81
/var/www/project/project-backend/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php:327
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Foundation/Testing/ApplicationTrait.php:51
/var/www/project/project-backend/test/Routes/AccountsTest.php:30
/var/www/project/project-backend/test/Routes/AccountsTest.php:49
我应该在 POST 调用中将任何特殊值作为参数 3、4、5 传递以使后续调用正常工作吗?
解决了。
问题不在 POST 或 JSON 中,而是
中的代码
symfony/browser-kit/Symfony/Component/BrowserKit/Client.php
试图变得聪明并保留以前请求的历史记录。
在调用了accounts/create
之后,然后languages
居然去了accounts/languages
在 $uri
参数的开头添加 / 就成功了。
$response1 = $this->call('GET', '/languages');
$response = $this->call('POST', '/accounts/create',array(),array(),array(),$userData);
$response1 = $this->call('GET', '/languages'); //this now works
我正在尝试 运行 Laravel 测试中的一系列 API 调用,但由于某种原因,调用 POST 方法时会破坏测试对象的状态根据 test class
文档的默认值 $userData = json_encode([
'username' => 'Bender',
'password' => 'CorrectHorseBatteryStaple123#',
'questions' => ['What is the airspeed of unladen swallow?'],
'answers' => ['African or european?'],
]);
$response1 = $this->call('GET', 'languages');
echo $response1;
$response = $this->call('POST', 'accounts/create',array(),array(),array(),$userData);
echo $response;
$this->assertResponseOk();
$response1 = $this->call('GET', 'languages'); //this is line 30
echo $response1;
$this->assertResponseOk();
第一个 GET 调用,POST 调用正常完成,return 预期结果。但是第二次 GET 调用失败。 (GET 和 POST 调用涉及代码和数据库的完全不同部分,不应相互影响。)
我得到的错误是
1) Project\Test\AccountsTest::testSample
Symfony\Component\HttpKernel\Exception\NotFoundHttpException:
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php:148
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1054
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1022
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1001
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:775
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:745
/var/www/project/project-backend/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php:81
/var/www/project/project-backend/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php:327
/var/www/project/project-backend/vendor/laravel/framework/src/Illuminate/Foundation/Testing/ApplicationTrait.php:51
/var/www/project/project-backend/test/Routes/AccountsTest.php:30
/var/www/project/project-backend/test/Routes/AccountsTest.php:49
我应该在 POST 调用中将任何特殊值作为参数 3、4、5 传递以使后续调用正常工作吗?
解决了。
问题不在 POST 或 JSON 中,而是
中的代码symfony/browser-kit/Symfony/Component/BrowserKit/Client.php
试图变得聪明并保留以前请求的历史记录。
在调用了accounts/create
之后,然后languages
居然去了accounts/languages
在 $uri
参数的开头添加 / 就成功了。
$response1 = $this->call('GET', '/languages');
$response = $this->call('POST', '/accounts/create',array(),array(),array(),$userData);
$response1 = $this->call('GET', '/languages'); //this now works