Laravel 5 单元测试。无法设置请求对象的 JSON
Laravel 5 unit testing. Unable to set JSON of Request object
你究竟如何让 Laravel 5.0 接受一个 JSON 编码的字符串到它的请求对象中?因为我的 REST api 返回了 500 个错误,经过仔细检查,请求对象有一个空的 json 属性...?
我的阵列:
private $test_1_create_user = array(
"name" => "Mr T Est",
"email" => "mrtest@somedomain.com",
"password" => "testing1234"
);
我的测试方法:
/**
* Attempts to Create a single user with no permissions
*/
public function testCreateUser(){
/** Obtain instance of Request object */
$req = $this->app->request->instance();
/** Set the JSON packet */
$req->json(json_encode($this->test_1_create_user));
/** Run the test */
$response = $this->call('POST', '/api/v1/user');
/** Read the response */
$this->assertResponseOk();
}
还有一个 var_dump
的 $req(精简了一点):
C:\wamp\www\nps>php phpunit.phar
PHPUnit 4.6.2 by Sebastian Bergmann and contributors.
Configuration read from C:\wamp\www\nps\phpunit.xml
class Illuminate\Http\Request#34 (25) {
protected $json =>
class Symfony\Component\HttpFoundation\ParameterBag#261 (1) {
protected $parameters =>
array(0) {
}
}
protected $sessionStore =>
NULL
protected $userResolver =>
NULL
protected $routeResolver =>
NULL
public $attributes =>
class Symfony\Component\HttpFoundation\ParameterBag#41 (1) {
protected $parameters =>
array(0) {
}
}
public $request =>
class Symfony\Component\HttpFoundation\ParameterBag#43 (1) {
protected $parameters =>
array(0) {
}
}
我花了很长时间才弄清楚如何从单元测试中访问请求对象。任何人都知道为什么 $req->json
总是空的? :( 干杯!
您尝试设置 json 值的方式不正确,因为 Request 中的 json 方法旨在从请求中获取 JSON 值,而不是设置它们。您需要为测试重新初始化 Request 对象。像这样的东西应该可以为您解决问题:
/**
* Attempts to Create a single user with no permissions
*/
public function testCreateUser(){
/** Obtain instance of Request object */
$req = $this->app->request->instance();
/** Initialize the Request object */
$req->initialize(
array(), // GET values
array(), // POST values
array(), // request attributes
array(), // COOKIE values
array(), /// FILES values
array('CONTENT_TYPE' => 'application/json'), // SERVER values
json_encode($this->test_1_create_user) // raw body content
);
/** Run the test */
$response = $this->call('POST', '/api/v1/user');
/** Read the response */
$this->assertResponseOk();
}
请记住,您可能需要根据需要填充其他请求值,我只包含了 Content-Type 和 json content
显然我把事情复杂化了。对于将 json 发布到 Laravel 控制器(在单元测试内部)时可能遇到问题的任何其他人,我只是通过以下方式解决了它:
$response = $this->call('POST', '/api/v1/user', $this->test_1_create_user);
关键元素是最后一个参数,它是一个 php 数组。这会在 POST 之前将 'magically' 转换为 json。非常缺乏这方面的文档...
你究竟如何让 Laravel 5.0 接受一个 JSON 编码的字符串到它的请求对象中?因为我的 REST api 返回了 500 个错误,经过仔细检查,请求对象有一个空的 json 属性...?
我的阵列:
private $test_1_create_user = array(
"name" => "Mr T Est",
"email" => "mrtest@somedomain.com",
"password" => "testing1234"
);
我的测试方法:
/**
* Attempts to Create a single user with no permissions
*/
public function testCreateUser(){
/** Obtain instance of Request object */
$req = $this->app->request->instance();
/** Set the JSON packet */
$req->json(json_encode($this->test_1_create_user));
/** Run the test */
$response = $this->call('POST', '/api/v1/user');
/** Read the response */
$this->assertResponseOk();
}
还有一个 var_dump
的 $req(精简了一点):
C:\wamp\www\nps>php phpunit.phar
PHPUnit 4.6.2 by Sebastian Bergmann and contributors.
Configuration read from C:\wamp\www\nps\phpunit.xml
class Illuminate\Http\Request#34 (25) {
protected $json =>
class Symfony\Component\HttpFoundation\ParameterBag#261 (1) {
protected $parameters =>
array(0) {
}
}
protected $sessionStore =>
NULL
protected $userResolver =>
NULL
protected $routeResolver =>
NULL
public $attributes =>
class Symfony\Component\HttpFoundation\ParameterBag#41 (1) {
protected $parameters =>
array(0) {
}
}
public $request =>
class Symfony\Component\HttpFoundation\ParameterBag#43 (1) {
protected $parameters =>
array(0) {
}
}
我花了很长时间才弄清楚如何从单元测试中访问请求对象。任何人都知道为什么 $req->json
总是空的? :( 干杯!
您尝试设置 json 值的方式不正确,因为 Request 中的 json 方法旨在从请求中获取 JSON 值,而不是设置它们。您需要为测试重新初始化 Request 对象。像这样的东西应该可以为您解决问题:
/**
* Attempts to Create a single user with no permissions
*/
public function testCreateUser(){
/** Obtain instance of Request object */
$req = $this->app->request->instance();
/** Initialize the Request object */
$req->initialize(
array(), // GET values
array(), // POST values
array(), // request attributes
array(), // COOKIE values
array(), /// FILES values
array('CONTENT_TYPE' => 'application/json'), // SERVER values
json_encode($this->test_1_create_user) // raw body content
);
/** Run the test */
$response = $this->call('POST', '/api/v1/user');
/** Read the response */
$this->assertResponseOk();
}
请记住,您可能需要根据需要填充其他请求值,我只包含了 Content-Type 和 json content
显然我把事情复杂化了。对于将 json 发布到 Laravel 控制器(在单元测试内部)时可能遇到问题的任何其他人,我只是通过以下方式解决了它:
$response = $this->call('POST', '/api/v1/user', $this->test_1_create_user);
关键元素是最后一个参数,它是一个 php 数组。这会在 POST 之前将 'magically' 转换为 json。非常缺乏这方面的文档...