简体   繁体   中英

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.

Class name should have been MyModelTest rather than MyModel . CakePHP's naming convention needs to be adhered to.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM