Я использую CakePHP 2.9.7 и пытаюсь написать оболочку, которая должна отправлять письма со ссылками (Router::url()
) в них. Ссылка будет указывать на страницу в моем приложении CakePHP, которая отправит еще одно письмо с другой ссылкой. Таким образом, мы получили одно письмо из оболочки и одно письмо из приложения.
Документация, которую я должен установить App.fullBaseUrl
если я хочу использовать маршрутизацию в оболочках: https://book.cakephp.org/2.0/en/console-and-shells.html#routing-in-shells-cli. Поскольку я не был уверен, включает ли это полный базовый путь, я просто спросил и узнал, что это действительно так. Итак, я сделал набор App.fullBaseUrl
что-то вроде http://example.com/my_app
, Письмо, отправленное в оболочке, теперь работает как шарм!
Тем не менее, некоторые другие ссылки, например, те в письмах, отправленных из приложения, теперь не работают, потому что они указывают на http://example.com/my_app/my_app
, Я думаю, что это как-то связано со мной, когда я хочу получить полный URL для этих ссылок. Большинство других ссылок работают нормально, потому что я не спрашиваю полный URL. Однако, если я пройду вдоль 'full_base' => true
опция в HtmlLinkHelper, такая же проблема возникает.
Я нашел это: https://github.com/cakephp/cakephp/pull/1718 так что я догадался, что это решит мою боль, и я просто установил App.fullBaseUrl
в http://example.com
и App.base для /myapp
, Это прекрасно работает в обоих случаях. «Я», — подумал я и провел все юнит-тесты. Они больше не работают.
Мои модульные тесты широко используют $this->testAction()
(в ControllerTests) и все вызовы $ this-> testAction теперь прерываются.
Например: у меня есть действие index в моем CartController, которое можно вызвать только через GET, поэтому мы написали тест для его вызова через POST. Это работало, пока я не установил «App.base».
public function testIndexPost() {
$this->testAction(
array(
'controller' => 'Cart',
'action' => 'index',
),
array(
'method' => 'POST',
'return' => 'vars',
)
);
}
Теперь я получаю сообщение об ошибке:
Не удалось утверждать, что исключение типа «MissingActionException» соответствует ожидаемому исключению «MethodNotAllowedException». Сообщение было: «Действие CartController :: Cart () не может быть найдено.».
Трассировки стека:
Action CartController::Cart() could not be found.
Test case: CartControllerTest(testIndexPost)
Stack trace:
F:\dev\xampp\htdocs\my_app\vendor\cakephp\cakephp\lib\Cake\Routing\Dispatcher.php : 193
F:\dev\xampp\htdocs\my_app\vendor\cakephp\cakephp\lib\Cake\Routing\Dispatcher.php : 167
F:\dev\xampp\htdocs\my_app\vendor\cakephp\cakephp\lib\Cake\TestSuite\ControllerTestCase.php : 287
ControllerTestCase::_testAction
F:\dev\xampp\htdocs\my_app\vendor\cakephp\cakephp\lib\Cake\TestSuite\ControllerTestCase.php : 199
F:\dev\xampp\htdocs\my_app\app\Test\Case\Controller\CartControllerTest.php : 83
F:\dev\xampp\htdocs\my_app\app\Test\Case\Controller\CartControllerTest.php : 83
CartControllerTest::testIndexPost
F:\dev\xampp\htdocs\my_app\vendor\phpunit\phpunit\PHPUnit\Framework\TestCase.php : 988
F:\dev\xampp\htdocs\my_app\vendor\phpunit\phpunit\PHPUnit\Framework\TestCase.php : 838
F:\dev\xampp\htdocs\my_app\vendor\phpunit\phpunit\PHPUnit\Framework\TestResult.php : 648
F:\dev\xampp\htdocs\my_app\vendor\phpunit\phpunit\PHPUnit\Framework\TestCase.php : 783
F:\dev\xampp\htdocs\my_app\vendor\cakephp\cakephp\lib\Cake\TestSuite\CakeTestCase.php : 82
F:\dev\xampp\htdocs\my_app\vendor\phpunit\phpunit\PHPUnit\Framework\TestSuite.php : 779
F:\dev\xampp\htdocs\my_app\vendor\phpunit\phpunit\PHPUnit\Framework\TestSuite.php : 749
F:\dev\xampp\htdocs\my_app\vendor\phpunit\phpunit\PHPUnit\TextUI\TestRunner.php : 350
F:\dev\xampp\htdocs\my_app\vendor\cakephp\cakephp\lib\Cake\TestSuite\CakeTestRunner.php : 62
F:\dev\xampp\htdocs\my_app\vendor\cakephp\cakephp\lib\Cake\TestSuite\CakeTestSuiteCommand.php : 98
F:\dev\xampp\htdocs\my_app\vendor\cakephp\cakephp\lib\Cake\TestSuite\CakeTestSuiteDispatcher.php : 259
F:\dev\xampp\htdocs\my_app\vendor\cakephp\cakephp\lib\Cake\TestSuite\CakeTestSuiteDispatcher.php : 96
F:\dev\xampp\htdocs\my_app\vendor\cakephp\cakephp\lib\Cake\TestSuite\CakeTestSuiteDispatcher.php : 113
F:\dev\xampp\htdocs\my_app\webroot\test.php : 104
Я мог бы, конечно, установить 'base' => false
(что заставляет это работать снова), но это просто не правильно. Мне не нужно менять все мои тесты только потому, что я установил App.base
в моем приложении, верно?
Поэтому, что бы я ни делал, я не могу заставить эту маршрутизацию работать со всеми CLI, веб-и юнит-тестами. Один из них всегда запутался.
Я делаю что-то неправильно?
Есть ли лучший способ справиться с этими вещами?
Это ошибка?
Кажется, проблема в том, что в объекте запроса базовый путь не удаляется из URL, сгенерированного для вашего testAction()
вызов.
В ControllerTestCase::_testAction()
при передаче URL-адреса в конструктор объекта запроса возможный базовый путь не удаляется из него, как если бы объект запроса генерировал сам URL-адрес в CakeRequest::_url()
вместо этого URL-адрес устанавливается как есть, что приводит к неправильному маршруту.
Я бы предложил сообщить об этом как об ошибке, ControllerTestCase::_testAction()
должно быть, заселить $_SERVER['REQUEST_URI']
вместо передачи URL-адреса CakeRequest
издеваться.
Пока это не исправлено, попробуйте изменить ControllerTestCase::_testAction()
временно так:
$_SERVER['REQUEST_URI'] = $url;
$request = $this->getMock('CakeRequest', array('_readInput'));
https://github.com/cakephp/…/blob/2.9.7/lib/Cake/TestSuite/ControllerTestCase.php#L251
Других решений пока нет …