vendredi 22 juillet 2016

Mock a method within a model method in CakePHP

I am running CakePHP 2.8.X, and am trying to write a unit test for a Model function.

Let's call the model Item, and I'm trying to test its getStatus method.

However, that model makes a call to its find within the getStatus method.

So something like this:

class Item extends Model
{
    public function getStatus($id) {
      // Calls our `$this->Item-find` method
      $item = $this->find('first', [
        'fields' => ['status'],
        'conditions' => ['Item.id' => $id]
      ]);

      $status = $item['status'];

      $new_status = null;

      // Some logic below sets `$new_status` based on `$status`
      // ...

      return $new_status;
    }
}

The logic to set "$new_status" is a bit complex, which is why I want to write some tests for it.

However, I'm not entirely sure how to override the find call within Item::getStatus.

Normally when I want to mock a Model's function, I use $this->getMock coupled with method('find')->will($this->returnValue($val_here)), but I don't want to completely mock my Item since I want to test its actual getStatus function.

That is, in my test function, I'm going to be calling:

// This doesn't work since `$this->Item->getStatus` calls out to
// `$this->Item->find`, which my test suite doesn't know how to compute.
$returned_status = $this->Item->getStatus($id);
$this->assertEquals($expected_status, $returned_status);

So how do I communicate to my real Item model within my test that it should override its internal call to its find method?

Aucun commentaire:

Enregistrer un commentaire