2017-04-11 8 views
0

私は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.fullBaseUrlhttp://example.com/my_appのように設定しました。シェルで送られたメールは今の魅力のように動作します!しかし、いくつかの他のリンク、例えば、。アプリケーション内から送信されたメール内のものは、http://example.com/my_app/my_appを指しているため、現在破損しています。私は、それらのリンクの完全なURLを欲しいと思っていることを私にしていると思います。私は完全なURLを要求しないので、ほとんどの他のリンクは正常に動作します。しかし、HtmlLinkHelperの'full_base' => trueオプションを渡すと、同じ問題が発生します。

私はこれが見つかりました:私は、これは私の痛みを解決するだろうと推測し、私はちょうど/myapphttp://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人はいつも迷惑をかける。

何か間違っていますか?
これらの問題に対処するより良い方法はありますか?
これはバグですか?

+0

エラースタックトレースを取得し、あなたの質問は、それはかなり難しいことを追加するために、予想される例外アサーションを削除します正確にエラーが発生する場所を知らずにアドバイスを提供する。また、これらの 'App。*'オプションをどのように設定するのですか? – ndm

+0

@ndmありがとうございました:)スタックトレースを含む答えを編集しました。 ControllerTestCase :: _ testActionをデバッグするとき、私が見ることができるライン236: '' $のURL =ルータ:: URL($のURL); '' リターン "/ MY_APP /カート" が、私はそれだけを返すべきだと思う「/カート" '' App.base''が設定されていなければ、それは返されます。おそらくモックオブジェクトジェネレータはこれで混乱しますか? core.php設定で 'App。*'オプションを設定しました。 – Livia

+0

あなたのアプリが 'my_app'サブフォルダにある場合、生成されたURLは' Router :: url() 'が生成するものであるという点で正しいです。この問題は、リクエストオブジェクトのコンストラクタにURLを渡すときに、リクエストオブジェクトが 'CakeRequest :: _ url()'でURL自体を生成するときと同じように、可能なベースパスが削除されないことが原因です。間違ったルートが一致しています。これをバグとして報告することをお勧めします.ControllerTestCase :: _ testAction()はURLを 'CakeRequest'モックに渡すのではなく、' $ _SERVER ['REQUEST_URI'] 'に入れるべきです。 – ndm

答えて

0

問題は、リクエストオブジェクトで、testAction()コール用に生成されたURLから基本パスが削除されていないようです。

ControllerTestCase::_testAction()では、リクエストオブジェクトのコンストラクタにURLを渡すと、リクエストオブジェクトがCakeRequest::_url()にURL自体を生成するときと同じように、ベースパスが削除されず、そのままURLが設定されますこれは、間違ったルートがマッチすることにつながります。私はreport this as a bugにお勧めしたい

ControllerTestCase::_testAction()は多分CakeRequestモックにURLを渡すのではなく、$_SERVER['REQUEST_URI']を移入する必要があります。

これが修正されるまで、このように一時的に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

関連する問題