3

我有一个内置在 Laravel (Dingo) 中的 API,它运行良好。但是我在实现 phpunit 来对我的 API 进行单元测试时遇到问题

class ProductControllerTest extends TestCase
{
    public function testInsertProductCase()
    {
        $data = array(
            , "description" => "Expensive Pen"
            , "price" => 100
        );

        $server = array();                        
        $this->be($this->apiUser);
        $this->response = $this->call('POST', '/products', [], [], $server, json_encode($data));
        $this->assertTrue($this->response->isOk());
        $this->assertJson($this->response->getContent());
    }

}

同时我的 API 端点指向这个控制器函数

private function store()
{

    // This always returns null
    $shortInput = Input::only("price");
    $rules = [
            "price" => ["required"]
    ];
    $validator = Validator::make($shortInput, $rules);

    // the code continues
    ...
}

但是它总是失败,因为 API 无法识别有效负载。Input::getContent() 返回 JSON,但 Input::only() 返回空白。进一步调查这是因为 Input::only() 仅在请求有效负载的内容类型为 JSON 时才返回值

那么......我如何将我的 phpunit 代码设置为使用 content-type application/json ?我假设它一定与此有关,$server但我不知道是什么

编辑:我原来的想法实际上有两个问题

  1. Input::getContent() 有效,因为我填写了第六个参数,但 Input::only() 不起作用,因为我没有填写第三个参数。感谢@shaddy
  2. 如何在 phpunit 请求标头中设置内容类型仍未得到解答

非常感谢

4

1 回答 1

9

调用函数的第三个参数必须是您作为输入参数发送到控制器的参数 - 在您的情况下是数据参数。

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

像下面的示例一样更改您的代码应该可以工作(您不必对数组进行 json_encode):

$this->response = $this->call('POST', '/products', $data);

在 Laravel 5.4 及更高版本中,您可以验证像 Content-Type 这样的标头的响应(文档):

$this->response->assertHeader('content-type', 'application/json');

或对于 Laravel 5.3 及以下版本(文档):

$this->assertEquals('application/json', $response->headers->get('Content-Type'));
于 2015-06-11T05:31:04.877 回答