私はCakePHP 2.9.7を使用しており、リンク(Router::url()
)でメールを送信するはずのシェルを作成しようとしています。このリンクは私のCakePHPアプリケーション内の別のリンクを持つ別のメールを送るページを指しています。そのため、シェルから1つのメールが送信され、アプリケーション内から1つのメールが送信されます。サブディレクトリでCakePHPを実行すると、シェル、Web、単体テストのURLに問題が発生しますか?
シェルでルーティングを使用する場合は、ドキュメントで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を要求しないので、ほとんどの他のリンクは正常に動作します。しかし、HtmlLinkHelperの'full_base' => true
オプションを渡すと、同じ問題が発生します。
私はこれが見つかりました:私は、これは私の痛みを解決するだろうと推測し、私はちょうど/myapp
にhttp://example.com
とApp.baseへApp.fullBaseUrl
を設定https://github.com/cakephp/cakephp/pull/1718を。これは、両方の用途で優れています。 「やれ」私はすべての単体テストを考えて走った。彼らはもはや働かない。
私の単体テストは、$this->testAction()
(ControllerTests内)を大量に使用し、すべての$ this-> testAction呼び出しが壊れています。 例:CartControllerには、GETでしか呼び出せないインデックスアクションがあり、POSTを使って呼び出すテストを書きました。これは私が 'App.base'を設定するまで機能しました。
public function testIndexPost() {
$this->testAction(
array(
'controller' => 'Cart',
'action' => 'index',
),
array(
'method' => 'POST',
'return' => 'vars',
)
);
}
今、私はエラーを取得:
Failed asserting that exception of type "MissingActionException" matches expected exception "MethodNotAllowedException". Message was: "Action CartController::Cart() could not be found.".
スタックトレース:
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、ウェブ、ユニットテストのすべてでこのルーティングを使用することはできません。そのうちの1人はいつも迷惑をかける。
何か間違っていますか?
これらの問題に対処するより良い方法はありますか?
これはバグですか?
エラースタックトレースを取得し、あなたの質問は、それはかなり難しいことを追加するために、予想される例外アサーションを削除します正確にエラーが発生する場所を知らずにアドバイスを提供する。また、これらの 'App。*'オプションをどのように設定するのですか? – ndm
@ndmありがとうございました:)スタックトレースを含む答えを編集しました。 ControllerTestCase :: _ testActionをデバッグするとき、私が見ることができるライン236: '' $のURL =ルータ:: URL($のURL); '' リターン "/ MY_APP /カート" が、私はそれだけを返すべきだと思う「/カート" '' App.base''が設定されていなければ、それは返されます。おそらくモックオブジェクトジェネレータはこれで混乱しますか? core.php設定で 'App。*'オプションを設定しました。 – Livia
あなたのアプリが 'my_app'サブフォルダにある場合、生成されたURLは' Router :: url() 'が生成するものであるという点で正しいです。この問題は、リクエストオブジェクトのコンストラクタにURLを渡すときに、リクエストオブジェクトが 'CakeRequest :: _ url()'でURL自体を生成するときと同じように、可能なベースパスが削除されないことが原因です。間違ったルートが一致しています。これをバグとして報告することをお勧めします.ControllerTestCase :: _ testAction()はURLを 'CakeRequest'モックに渡すのではなく、' $ _SERVER ['REQUEST_URI'] 'に入れるべきです。 – ndm