mercredi 1 avril 2015

CakePHP 2 testing model with no table using mock method for email

I'm attempting to write a test for a model that has no table but sends an email if the data passes validation in CakePHP 2.


To test I want to assert that some data passes validation and would therefore send an email without actually sending one. For this I am attempting to create a mock method for CakeEmail. However, the test is failing because $useDbConfig hasn't be defined for the mock method:-



Undefined property: Mock_MyModel_7a1fb8d0::$useDbConfig


I assume this is an issue with the model not having a table, but cannot see how to resolve it.


My model looks something like (excluding the validation rules):-



<?php

App::uses('CakeEmail', 'Network/Email');

class MyModel extends AppModel {

public $useTable = false;

public function send($data) {

$this->set($data);

if ($this->validates() === false) {
return false;
} else {
$Email = $this->getEmailer();
$Email->from($data['MyModel']['email_from']);
$Email->to($data['MyModel']['email_to']);
$Email->subject($data['MyModel']['subject']);
$Email->send($data['MyModel']['message']);
}

return true;

}

public function getEmailer() {
return new CakeEmail();
}

}


My test is:-



<?php
class MyModel extends CakeTestCase {

public function setUp() {
parent::setUp();
$this->MyModel = ClassRegistry::init('MyModel');
}

public function testSend() {

$emailer = $this->getMock(
'CakeEmail',
array(
'to',
'emailFormat',
'subject',
'replyTo',
'from',
'template',
'viewVars',
'send'
)
);
$emailer->expects($this->any())->method('send')->will($this->returnValue(true));

$MyModel = $this->getMockForModel('MyModel', array('getEmailer'));
$MyModel->expects($this->once())->method('getEmailer')->will($this->returnValue($emailer));

$data = array(
'MyModel' => array(
'email_to' => 'foo@example.com',
'email_from' => 'bar@example.com',
'subject' => 'Foo bar',
'message' => ''
)
);

$result = $MyModel->send($data);
$this->assertTrue($result);

}

}


Any help would be appreciated. This is the first time I've tried/needed to mock a method in Cake using tests.


Aucun commentaire:

Enregistrer un commentaire