如何在流明上对GraphQL响应进行单元测试?

时间:2019-03-09 23:34:05

标签: json api phpunit graphql lumen

我正在尝试测试使用Lumen (PHP)构建的API,但是我在unit test的响应GraphQL上停留了一段时间。

这是我尝试过的:

class MovieQueryTest extends Tests\GraphQLTestCase
{
    use DatabaseMigrations;

    public function testCanSearch()
    {
        Movie::create([
            'name' => 'Fast & Furious 8',
            'alias' => 'Fast and Furious 8',
            'year' => 2016
        ]);

        $response = $this->post('/graphql/v1', [
            'query' => '{movies(search: "Fast & Furious"){data{name}}}'
        ]);

        $response->seeJson([
            'data' => [
                'movies' => [
                    'data' => [
                        'name' => 'Fast & Furious 8'
                    ]
                ]
            ]
        ]);
    }
}

这就是我得到的:

  

Sebastian Bergmann及其贡献者的PHPUnit 7.5.6。

     

F ..... 6   / 6(100%)

     

时间:690毫秒,内存:24.00 MB

     

有1个失败:

     

1)MovieQueryTest :: testCanSearch无法找到JSON片段   内的[“ data”:{“ movies”:{“ data”:{“ name”:“ Fast&Furious”}}}]]   [{“ data”:{“ movies”:{“ data”:[]}}}]。无法断言false是   是的。

问题是我的数据结构与JSON's结构不匹配。当我的数据位于Array内时,JSON的数据位于Object内,我不知道如何使其匹配:

  • ["data":{"movies":{"data":{"name":"Fast & Furious 8"}}}]
  • [{"data":{"movies":{"data":[{"name":"Fast & Furious 8"}]}}}]

如何使我的数据结构与JSON的数据结构匹配,或者有更好的方法在流明上对GraphQL响应进行单元测试?

1 个答案:

答案 0 :(得分:0)

您需要将'name' => 'Fast & Furious 8'包装在它自己的数组中,例如:

以下内容:

$array = [
    'data' => [
        'movies' => [
            'data' => [
                ['name' => 'Fast & Furious 8']
            ]
        ]
    ]
];

应输出:

{"data":{"movies":{"data":[{"name":"Fast & Furious 8"}]}}}