Dahab
Dahab

Reputation: 524

Symfony2 functional test client request returns error 500

I have a controller that i am trying to do a functional test for it.

controller:

<?php

namespace Zanox\AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Exception;

/**
 * 
 * @author Mohamed Ragab Dahab <[email protected]>
 * 
 * @Route("merchant")
 * 
 */
class ReportController extends Controller {

    /**
     * Show transaction report regarding to the given merchant ID
     * @author Mohamed Ragab Dahab <[email protected]>
     * @access public
     * 
     * @Route("/{id}/report", name="merchant-report")
     * 
     * @param int $id   Merchant ID
     */
    public function showAction($id) {
        try {
            //Order Service
            $orderService = $this->get('zanox_app.orderService');

            //merchant Orders
            $orders = $orderService->getMerchantOrders($id);

            //render view and pass orders array
            return $this->render('ZanoxAppBundle:Report:show.html.twig', ['orders' => $orders]);
        } catch (Exception $e) {
            //log errors
        }
    }

}

I have created a functional test as following:

namespace Zanox\AppBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ReportControllerTest extends WebTestCase {

    /**
     * 
     */
    public function testShow() {
        //Client instance
        $client = static::createClient();

        //Act like browsing the merchant listing page, via GET method
        $crawler = $client->request('GET', '/merchant/{id}/report', ['id'=> 1]);

        //Getting the response of the requested URL
        $crawlerResponse = $client->getResponse();

        //Assert that Page is loaded ok
        $this->assertEquals(200, $crawlerResponse->getStatusCode());

        //Assert that the response content contains 'Merchant Listing' text
        $this->assertTrue($crawler->filter('html:contains("Merchant Report")')->count() > 0);
    }

}

However this test fails as the first assertion returns status 500 instead of 200

Test log shows: [2015-07-06 21:00:24] request.INFO: Matched route "merchant-report". {"route_parameters":{"_controller":"Zanox\AppBundle\Controller\ReportController::showAction","id":"{id}","_route":"merchant-report"},"request_uri":"http://localhost/merchant/{id}/report?id=1"} []

Letting you know that ['id' => 1] exists in DB.

First Question: why it fails?

Second Question: am i doing the functional test in a proper way?

Upvotes: 2

Views: 1366

Answers (2)

COil
COil

Reputation: 7606

If you look at the logs, you see that the {id} parameter is not correctly replaced but is added in the query string of your Uri. So try with:

$crawler = $client->request('GET', sprintf('/merchant/%d/report', 1));

When using GET, the third parameter will add query parameters for the URI, when using POST, these data will be posted.

Upvotes: 1

Steven Musumeche
Steven Musumeche

Reputation: 2936

As to why it fails - you can troubleshoot the problem by using a debugger to step through the controller code when it is executed in your test. For your second question, yes, you are doing a simple functional test correctly.

Upvotes: 0

Related Questions