«Попытка получить свойство необъекта» при выполнении теста JSON-запроса в Symfony 4.1 - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь написать контрольный пример для проверки моей операции по сохранению данных в базе данных с помощью Symfony 4.1.Операция уже работает, и она выглядит следующим образом:

public function storeAction(Request $request)
{
    $data = json_decode($request->getContent());

    try {
        $entityManager = $this->getDoctrine()->getManager();

        $createdAt = \DateTime::createFromFormat("Y-m-d H:i:s", $data->createdAt);
        $concludedAt = \DateTime::createFromFormat("Y-m-d H:i:s", $data->concludedAt);

        $task = new Task();
        $task->setDescription($data->description);
        $task->setCreatedAt($createdAt);
        $task->setConcludedAt($concludedAt);

        $entityManager->persist($task);
        $entityManager->flush();


        return $this->json([
            "message" => "Task created",
            "status" => 200
        ]);
    } catch (\Exception $e) {
        return $this->json([
            "error" => [
                "code" => 500,
                "message" => $e->getMessage(),
                "file" => $e->getFile()
            ]
        ]);
    }
}

Использование Insonmnia REST с отправкой JSON работает.Но тест покажет мне

Попытка получить свойство 'createAt' необъектного

, указывающее на мой класс контроллера.Это тест:

public function testStoreTaskEndpointStatusCode200AndTaskCreated()
{
    $client = static::createClient();
    $client->request(
        "POST",
        "/tasks",
        [],
        [],
        [
            "CONTENT_TYPE" => "application/json",
            '{"description": "Goodbye, world!", "createdAt": "2012-12-21 00:00:00", "concludedAt": "2012-12-21 00:00:01"}'
        ]
    );

    $obj = json_decode($client->getResponse()->getContent());

    var_dump($obj); // <~ the error message is shown

    $this->assertEquals(200, $client->getResponse()->getStatusCode());
    $this->assertTrue($client->getResponse()->headers->contains("Content-Type", "application/json"));
}

В документации показан этот способ отправки JSON на контроллер для тестирования.Итак, почему это терпит неудачу?

1 Ответ

0 голосов
/ 12 июня 2018

Вы должны передать данные содержимого в виде семи аргументов метода запроса, например:

$client->request(
        "POST",
        "/tasks",
        [],
        [],
        [
            "CONTENT_TYPE" => "application/json",
        ],
            '{"description": "Goodbye, world!", "createdAt": "2012-12-21 00:00:00", "concludedAt": "2012-12-21 00:00:01"}'

    );

PS: Я предлагаю вам проверить, обнаруживает ли json_encode ошибки, проверив

$obj = json_decode($client->getResponse()->getContent());

if (false === $obj) {
   // Invalid json provided
}
...