我正在为登录系统编写单元测试 - 但是在与Zend_Session_Namespace对象进行交互时遇到了困难。我正在使用PHPUnit框架的Zend_Test扩展(ZF 1.10,PHPUnit 3.4.5)
测试
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 bootstrap中有这些行:
Zend_Session::$_unitTestEnabled = true;
Zend_Session::start();
如何确认会话消息设置正确?
答案 0 :(得分:0)
今天在重新审视这个问题时,有一个完整的面孔时刻:
我的Zend_Session_Namespace上的“message”属性实际上是一个魔术属性(使用__get和__set访问),并且无法通过反射识别(这是PHPUnit在调用assertObjectHasAttribute时测试属性是否存在的方式)。 / p>
从测试中删除断言允许它继续,我的测试现在在预期的点上失败而不是过早。