Search code examples
unit-testingcakephpmockingphpunitcakephp-2.1

how to create a mock in a model test case


Maybe I am doing this wrong.

I'd like to test the beforeSave method of a model (Antibody). A part of this method calls a method on an associated model (Species). I'd like to mock the Species model but don't find how.

Is it possible or am I doing something that goes against the MVC pattern and thus trying to do something that I shouldn't?

class Antibody extends AppModel {
    public function beforeSave() {

        // some processing ...

        // retreive species_id based on the input 
        $this->data['Antibody']['species_id'] 
            = isset($this->data['Species']['name']) 
            ? $this->Species->getIdByName($this->data['Species']['name']) 
            : null;

        return true;
    }
}

Solution

  • Assuming your Species model in created by cake due to relations, you can simply do something like this:

    public function setUp()
    {
        parent::setUp();
    
        $this->Antibody = ClassRegistry::init('Antibody');
        $this->Antibody->Species = $this->getMock('Species');
    
        // now you can set your expectations here
        $this->Antibody->Species->expects($this->any())
            ->method('getIdByName')
            ->will($this->returnValue(/*your value here*/));
    }
    
    public function testBeforeFilter()
    {
        // or here
        $this->Antibody->Species->expects($this->once())
            ->method('getIdByName')
            ->will($this->returnValue(/*your value here*/));
    }