Jlappano
Jlappano

Reputation: 147

Mock controller in Symfony2 unit test

I am writing unit tests for an API Service in a Symfony2 project. One service method takes a controller instance as an argument, and handles the requested JSON.

    public function getJSONContent(Controller $controller) {
        $version = $this->getAPIVersion();

        //Read in request content
        $content = $controller->get("request")->getContent();
        if (empty($content)) {
            throw new HttpException(400, 'Empty request payload');
        }


        //Parse and Detect invalid JSON
        $jsonContent = json_decode($content, true);
        if($jsonContent === null) {
            throw new HttpException(400, 'Malformed JSON content received');
        }

        return $jsonContent;
    }

The following is my test:

class ApiTest extends \PHPUnit_Framework_TestCase {
    public function testGetJSONContent() {

        // Create a stub for the OrgController Object
        $stub = $this->getMock('OrganizationController');

        // Create the test JSON Content
        $post = 'Testy Test';
        $request = $post;
        $version = "VersionTest";
        $APIService = new APIService();

        // Configure the Stub to respond to the get and getContent methods
        $stub->expects($this->any())
             ->method('get')
             ->will($this->returnValue($post));

        $stub->expects($this->any())
             ->method('getContent')
             ->will($this->returnValue($request));

        $stub->expects($this->any())
             ->method('getAPIVersion')
             ->will($this->returnValue($version));


        $this->assertEquals('Testy Test', $APIService->getJSONContent($stub));
    }
}

My test throws the following error:

Argument 1 passed to Main\EntityBundle\Service\APIService::getJSONContent() must be an instance of Symfony\Bundle\FrameworkBundle\Controller\Controller, instance of Mock_OrganizationController_767eac0e given.

My stub is obviously not fooling anyone, is there any way to fix this?

Upvotes: 4

Views: 1772

Answers (1)

Alberto Gaona
Alberto Gaona

Reputation: 2437

Use the namespace to specify the controller you are mocking. I.e.

    // Create a stub for the OrgController Object
    $stub = $this->getMock('Acme\AcmeBundle\Controller\OrganizationController');

Upvotes: 2

Related Questions