#symfony #response #behat #fosrestbundle
#symfony #ответ #behat #fosrestbundle
Вопрос:
Я пытаюсь протестировать свой API с помощью Behat, но получаю 500 на каждый ответ.
API отлично работает за пределами Behat.
Вот часть моего файла config.yml для пакета :
fos_rest:
param_fetcher_listener: true
body_listener: true
routing_loader:
include_format: false
format_listener:
rules:
- { priorities: ['json','html'], fallback_format: json }
view:
view_response_listener: true
failed_validation: 422
serializer:
serialize_null: true
disable_csrf_role : IS_AUTHENTICATED_ANONYMOUSLY
Для моего контроллера я решил расширить FOSRestController, используя get / cget /… синтаксис.
Вот пример действия.
<?php
namespace RcpIndexBundleCoreBundleController;
use SymfonyComponentHttpFoundationRequest;
use FOSRestBundleRequestParamFetcher;
use FOSRestBundleControllerAnnotationsQueryParam;
use FOSRestBundleControllerAnnotationsRoute;
use FOSRestBundleControllerFOSRestController;
use FOSRestBundleRoutingClassResourceInterface;
use NelmioApiDocBundleAnnotationApiDoc;
use RcpIndexBundleCoreBundleFormRcpType;
/**
* @package RcpIndexBundleCoreBundleController
*/
class RcpController extends FOSRestController implements ClassResourceInterface
{
use PaginatorTrait;
/**
* Get rcp list
*
* @param ParamFetcher $paramFetcher
*
* @return FOSRestBundleViewView
*
* @QueryParam(name="page", requirements="d ", default="1", description="Current page index")
* @QueryParam(name="per_page", requirements="d ", default="50", description="Number of elements displayed per page")
*
* @ApiDoc(
* section="Rcp",
* description="Get rcp list",
* output="RcpIndexBundleCoreBundleEntityRcp",
* statusCodes={
* 200="OK",
* 400="Bad request"
* }
* )
*/
public function cgetAction(ParamFetcher $paramFetcher)
{
list($offset, $limit) = $this->getStartAndLimitFromParams($paramFetcher);
$entities = $this->get('rcpindex.manager.rcp')->findAllInRange($offset, $limit);
return $this->view($entities, 200);
}
//...
Затем, есть моя функция Behat. Я использую Behat MinkExtension и Sanpi Behatch в качестве поставщиков контекста.
Feature: Rcplist
Scenario: Get empty list
Given I add "CONTENT_TYPE" header equal to "application/json"
When I send a GET request on "/api/1.0/rcps"
Then the response status code should be 200
И я получаю следующую ошибку: «Текущий код статуса ответа равен 500, но ожидается 200».
Я пытался ее отладить, но код выполняется хорошо, а метод $this-> view() не выдает уловимого исключения (и после небольшого поиска метод View::create () работает хорошо).
Я думаю, что возврат «cgetAction» хорош, но это может быть связано с тем, как обрабатывается ответ. Мои плохие знания об обработке ответов Symfony не позволяют мне отладить это.
Есть идеи, где искать (или, что еще лучше, любое решение?)
Комментарии:
1. проверьте приложение / журналы / файлы, чтобы увидеть, ошибка ли это Symfony. И покажите ваш файл контекста.
Ответ №1:
У меня были проблемы такого же рода. Чтобы проверить, что вызывает ошибку, в ExceptionController
пакете FOS / RestBundle vendor/friendsofsymfony/rest-bundle/FOS/RestBundle/Controller/ExceptionController.php
, в разделе catch showAction()
метода, попробуйте напрямую удалить исключение, вы получите более подробную информацию:
} catch (Exception $e) {
var_dump($e);
die();
$message = 'An Exception was thrown while handling: ';
$message.= $this->getExceptionMessage($exception);
$response = new Response($message, Codes::HTTP_INTERNAL_SERVER_ERROR, $exception->getHeaders());
}
Ответ №2:
У меня была такая же проблема с Symfony 4, потому что я забыл установить переменные среды в .env.test