CakePHP, запущенный в подкаталоге, создает проблемы с URL в shell, web и unit-тестах?

Я использую 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, веб-и юнит-тестами. Один из них всегда запутался.

Я делаю что-то неправильно?
Есть ли лучший способ справиться с этими вещами?
Это ошибка?

0

Решение

Кажется, проблема в том, что в объекте запроса базовый путь не удаляется из 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

0

Другие решения

Других решений пока нет …