4

Magento POST コントローラーのアクションをテストする方法はありますか? 例: 顧客ログイン:

Mage_Customer_AccountController::loginPostAction()

テストには EcomDev_PHPUnit モジュールを使用しています。基本的なアクションではうまく機能しますが、POST アクションを呼び出すことができません。

$this->getRequest()->setMethod('POST');
// ivokes loginAction instead loginPostAction
$this->dispatch('customer/account/login');
// fails also
$this->dispatch('customer/account/loginPost');
// but this assert pass
$this->assertEquals('POST', $_SERVER['REQUEST_METHOD']);

テストを多かれ少なかれ次のようにしたい

// ... some setup
$this->getRequest()->setMethod('POST');
$this->dispatch('customer/account/login');
// since login uses singleton, then...
$session = Mage::getSingleton('customer/session');
$this->assertTrue($session->isLoggedIn());
4

1 に答える 1

13

カスタマー アカウント コントローラーでは、login と loginPost は 2 つの異なるアクションです。ログインに関しては、次のようなことを行う必要があります。

// Setting data for request
$this->getRequest()->setMethod('POST')
        ->setPost('login', array(
            'username' => 'customer@email.com',
            'password' => 'customer_password'
        ));

$this->dispatch('customer/account/loginpost'); // This will login customer via controller

ただし、この種のテストボディは、ログインプロセスをテストする必要がある場合にのみ必要ですが、顧客がログインしていることをシミュレートしたい場合は、特定の顧客がログインしているスタブを作成できます.私はいくつかのプロジェクトでそれを使用しました. このメソッドをテスト ケースに追加するだけで、必要なときに使用できます。1 回のテスト実行で顧客にログインし、その後すべてのセッション変更を破棄します。

/**
 * Creates information in the session,
 * that customer is logged in
 *
 * @param string $customerEmail
 * @param string $customerPassword
 * @return Mage_Customer_Model_Session|PHPUnit_Framework_MockObject_MockObject
 */
protected function createCustomerSession($customerId, $storeId = null)
{
    // Create customer session mock, for making our session singleton isolated
    $customerSessionMock = $this->getModelMock('customer/session', array('renewSession'));
    $this->replaceByMock('singleton', 'customer/session', $customerSessionMock);

    if ($storeId === null) {
        $storeId = $this->app()->getAnyStoreView()->getCode();
    }

    $this->setCurrentStore($storeId);
    $customerSessionMock->loginById($customerId);

    return $customerSessionMock;
}

また、renewSession メソッドは上記のコードでモック化されています。これは、コア/Cookie モデルの代わりに直接 setcookie 関数を使用しているため、コマンド ラインでエラーが発生するためです。

敬具、イヴァン

于 2012-07-31T12:28:38.667 に答える