2

ログインシステムの単体テストを作成していますが、Zend_Session_Namespaceオブジェクトとの対話に問題があります。PHPUnitフレームワーク(ZF 1.10、PHPUnit 3.4.5)のZend_Test拡張機能を使用しています

テスト

public function testAuthFailure()
{
  $request = $this->getRequest();
  $request->setMethod("POST");
  $request->setPost("username", "testUser");
  $request->setPost("password", "testPassword");

  $this->dispatch("/auth/login");

  $this->assertModule("auth");
  $this->assertController("login");
  $this->assertAction("validate");

  $loginSession = new Zend_Session_Namespace("login");
  $this->assertFalse(is_null($loginSession));
  $this->assertObjectHasAttribute("messages", $loginSession);
  $this->assertFalse(empty($loginSession->messages));
  $this->arrayHasKey("error", $loginSession->messages["error"]);
  $this->assertEquals($loginSession->messages["error"], "Could not log you in with that username and/or password");
}

現在のコントローラー/アクションコード

public function validateAction()
{
  $loginSession = new Zend_Session_Namespace("login");

  if (!$this->buildForm()->isValid($this->getRequest()->getPost())) {
    $loginSession->messages["error"][] = "Please enter your username and password";
  }

  $loginSession->messages["error"][] = "Could not contact the authentication server";

  $this->getResponse()
    ->setHttpResponseCode(303)
    ->setHeader("Location", "/auth/login");
}

私の単体テストは$this->assertObjectHasAttribute("messages", $loginSession);-で失敗していますが、メッセージの実際の内容では失敗すると予想されます。

phpunitブートストラップに次の行があります。

Zend_Session::$_unitTestEnabled = true;
Zend_Session::start();

セッションメッセージが正しく設定されていることを確認するにはどうすればよいですか?

4

1 に答える 1

0

今日この問題を再検討したとき、完全な顔の瞬間がありました:

Zend_Session_Namespaceの「message」プロパティは実際には魔法のプロパティ(__getと__setを使用してアクセス)であり、リフレクション(PHPUnitがassertObjectHasAttributeの呼び出しでプロパティの存在をテストする方法)では識別できません。

テストからアサーションを削除すると、アサーションを続行できます。テストは、時期尚早ではなく、期待される時点で失敗するようになりました。

于 2012-10-02T07:30:06.867 に答える