2013-08-27 5 views
0

Я пишу множество модельных испытаний в CakePHP (PHPUnit)CakePHP UnitTest метод, который вызывает другую модель

В TravisCI, я получаю что-то вроде: «Base таблицы или просмотреть не найден: тест 1146 Table». события в тестовом бегуне Cake, я получаю отказ утверждения

проблемы я имею есть методы в моих ModelClasses, что я пытаюсь проверить называющие другие модели с App :: использованиями Например:..

Метод по модели пользователя:

public function getOtherData() { 
    App::uses('Event', 'Model'); 
    $this->Event = new Event; 
    return $this->Event->find('all'); 
} 

И тест:

public function testGetOtherData() { 
    $result = $this->User->getOtherData(); 
    $this->assertTrue(!empty($result)); 
} 

Обратите внимание на приведенный выше пример только что. Пример, упрощенный, чтобы показать проблему. Я понимаю, что в приведенном выше примере есть лучшие способы «сделать торт».

Кроме того, я использую определение необходимых светильников, и они отлично работают. (Я знаю это другим способом в модели, которая использует соединение в поиске, а не App :: Uses())

EDIT: Код при запуске работает, НО UnitTest ищет другие модели данных (При использовании App :: uses) в базе данных по умолчанию, а не в тестовой базе данных. Почему он не использует тестовую базу данных? Я что-то упускаю?

ПОСЛЕДНЕГО ПРИМЕЧАНИЕ

Использование App :: использование(), а затем инстанцирование класса будет работать во время выполнения. Но во время тестирования он будет терпеть неудачу, поскольку он пытается использовать соединение с базой данных по умолчанию вместо соединения с тестовой базой данных.

За выбранный ответ, а не использование App :: uses, Cakes, встроенный в реестр классов, ClassRegistry::init('Model', true);, вы можете включить модель из другого метода модели.

+0

Вы уверены, что свойство $ useDbConfig не задано в вашей модели? –

+0

Я уверен, @ joshua.paling спасибо :) – alairock

ответ

1

Как правило, не рекомендуется создавать объект в середине ваших функций, используя новый оператор. Вот почему - невозможно заблокировать или перенаправить этот вызов. Кроме того, не обязательно легко получить правильные параметры для конструктора объекта, когда он находится в середине другой функции, поэтому лучше оставить этот код отдельным.

Правильный способ сделать это - использовать другой метод вызова для получения вашего объекта. Если вы используете Cake's ClassRegistry::init() для создания объектов модели, они должны использовать тестовую базу данных.

Если вам нужно создать другие объекты, отличные от Cake, лучше создать их, используя некоторую другую функцию, например. $this->fetchMeOneOThemEventThingies(). Затем, во время тестирования, вы можете высмеять эту функцию и вернуть ей что-то еще. Или вы могли бы использовать какой-либо другой контейнер DI, такой как pimple, который будет выполнять ту же роль, что и класс Cake's CreeRegistry.

Если вам нужен макет моделируемого объекта для тестирования, обязательно передайте соответствующие аргументы конструктору модели в качестве третьего параметра в getMock() или он может использовать производственную базу данных.

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