PHPUnit, как издеваться над созданной моделью - PullRequest
0 голосов
/ 27 августа 2010

Как я застрял с написанием теста для следующего кода. Я хочу издеваться над $ userModel, но как я могу добавить это в тест?

class PC_Validate_UserEmailDoesNotExist extends Zend_Validate_Abstract
{
    public function isValid($email, $context = NULL)
    {
        $userModel = new Application_Model_User();
        $user = $userModel->findByEmailReseller($email, $context['reseller']);

        if ($user == NULL) {
            return TRUE;
        } else {
            return FALSE;
        }
    }
}

Обновление: Решение

Я изменил свой класс на следующий, чтобы он стал тестируемым, теперь он использует внедрение зависимостей. Больше информации о внедрении зависимостей вы можете узнать здесь

Теперь я называю класс следующим образом:

new PC_Validate_UserEmailDoesNotExist(new Application_Model_User()

Реорганизованный класс

class PC_Validate_UserEmailDoesNotExist extends Zend_Validate_Abstract
{
    protected $_userModel;

    public function  __construct($model)
    {
        $this->_userModel = $model;
    }

    public function isValid($email, $context = NULL)
    {
        if ($this->_userModel->findByEmailReseller($email, $context['reseller']) == NULL) {
            return TRUE;
        } else {
            return FALSE;
        }
    }
}

Юнит тест

class PC_Validate_UserEmailDoesNotExistTest extends BaseControllerTestCase
{
    protected $_userModelMock;

    public function setUp()
    {
        parent::setUp();
        $this->_userModelMock = $this->getMock('Application_Model_User', array('findByEmailReseller'));
    }

    public function testIsValid()
    {
        $this->_userModelMock->expects($this->once())
                        ->method('findByEmailReseller')
                        ->will($this->returnValue(NULL));

        $validate = new PC_Validate_UserEmailDoesNotExist($this->_userModelMock);
        $this->assertTrue(
                $validate->isValid('jef@test.com', NULL),
                'The email shouldn\'t exist'
        );
    }

    public function testIsNotValid()
    {
        $userStub = new \Entities\User();

        $this->_userModelMock->expects($this->once())
                        ->method('findByEmailReseller')
                        ->will($this->returnValue($userStub));

        $validate = new PC_Validate_UserEmailDoesNotExist($this->_userModelMock);
        $this->assertFalse(
                $validate->isValid('jef@test.com', NULL),
                'The email should exist'
        );
    }
}

1 Ответ

1 голос
/ 27 августа 2010

Краткий ответ: вы не можете, потому что вы жестко закодировали зависимость в метод.

Для этого есть три способа:

1) Сделайте используемое имя класса настраиваемым, чтобы вы могли что-то сделатьнапример:

$className = $this->userModelClassName;
$userModel = new $className();

или 2) Добавить третий параметр к сигнатуре метода, который позволяет передавать зависимость

public function isValid($email, $context = NULL, $userModel = NULL)
{
    if($userModel === NULL)
    {
        $userModel = new Application_Model_User();
    }
    // ...
}

или 3) использовать set_new_overload(), как описано в

Примечание: расширение Test-Helper заменено на https://github.com/krakjoe/uopz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...