2015-04-01 1 views
0

Я пытаюсь написать тест для модели, которая не имеет таблицы, но посылает по электронной почте, если данные проходят проверку в CakePHP 2.CakePHP модели 2 тестирования без таблицы с использованием макетом метода для электронной почты

Чтобы проверить I хочу утверждать, что некоторые данные проходят проверку и поэтому отправляют электронное письмо без фактической отправки. Для этого я пытаюсь создать метод mock для CakeEmail. Тем не менее, тест не удается, потому что $ useDbConfig уже быть не определен для фиктивного метода: -

Undefined property: Mock_MyModel_7a1fb8d0::$useDbConfig 

Я предполагаю, что это проблема с моделью, не имея таблицу, но не может видеть, как решить ее.

Моя модель выглядит примерно так (за исключением правил проверки): -

<?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(); 
    } 

} 

Мой тест: -

<?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' => '[email protected]', 
       'email_from' => '[email protected]', 
       'subject' => 'Foo bar', 
       'message' => '' 
      ) 
     ); 

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

    } 

} 

Любая помощь будет оценена. Это первый раз, когда я пытался/должен был издеваться над методом в Cake, используя тесты.

+1

Является ли ваш класс тестов действительно «MyModel»? – ndm

+0

@ndm спасибо, я чувствую себя действительно глупо сейчас. Разумеется, это должен быть MyModelTest, который решает мою проблему. Я смотрел этот код целую вечность, не могу поверить, что я пропустил это! – drmonkeyninja

ответ

0

Название класса должно быть MyModelTest, а не MyModel. Необходимо соблюдать правила именования CakePHP.

Смежные вопросы