2010-07-28 2 views
9

로그인이 필요하고 zend_acl과 zend_auth를 사용하는 애플리케이션이 있습니다.Zend Auth와 Zend ACL을 이용한 PHP 유닛 테스팅

사전 발송 중에 ACL에 대한 모든 규칙을 만드는 ACL 플러그인이 있습니다. 또한 Auth 플러그인을 사용하여 로그인했는지 여부를 확인하고 만약 그렇다면 ACL에 따라 요청 된 리소스에 액세스 할 수 있는지 확인하십시오.

응용 프로그램이 불가능하거나, 내가 뭔가를 분명 누락 오히려 더 가능성이있을 것으로 보인다.

단위 테스트에 로그인 한 경우 ACL은 생성되는 로그인 뒤에 완전히 때문이다.

내 단위 테스트 설정 방법에서는 zend_auth 인스턴스를 반환하는 성공적인 로그인을 시뮬레이션합니다. 통과 한 테스트는이 로그인에 성공했음을 나타냅니다.

그러나 테스트를 통해 다른 위치로 파견을 시도하거나 로그인 한 사용자가 주어진 리소스에 액세스 할 수 있는지 평가하면 여전히 플러그인에 의해 로그인되지 않은 상태이므로 거부됩니다. 이것이 왜 있는지, 누군가 조언 할 수 있습니까?

예를 들어이 통과 :이 플러그인에 의해 거부 것 같은

public function testLoggedIn() 
{ 
    $this->assertTrue(Zend_Auth::getInstance()->hasIdentity()); 
} 

이 실패

public function testUserAccess() 
{ 

    $this->dispatch('/home'); 
      $this->assertResponseCode(200); 
      $this->assertQueryContentContains('#nav_side'); 
      $this->resetRequest() 
      ->resetResponse(); 

} 

이를, 난 여전히 플러그인으로 로그인 페이지로 다시 리디렉션 것으로 보인다 발견 사용자가 로그인했는지 모르 십니다.

도움을 주시면 감사하겠습니다.

답변

3

당신이 설명하는 문제는 전역 변수와 OOP 전역 변수 (싱글 톤 패턴)의 사용으로 인해 많이 발생합니다. 매우 설명이기 때문에 다른 어떤 가능성이있어와 한 의존성 주입과를 사용하여이를 방지 할 수있는 방법에 대해 설명합니다 phpunit을의 저자의 글이 있습니다

, 난 그냥 제안 당신은 그것을 읽을 수 있습니다 : http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

추악한 대안으로 (빠른 결과가 필요한 경우) Zend_Auth (링크에서 설명)의 스텁을 만들고 PHP 5.3 리플렉션 API를 사용하여 Zend_Auth 인스턴스 변수를 스텁에 설정할 수 있습니다. (질문은 다른 대답없이 4 시간을 살았던) 여기

+0

예 - 문제가있는 것으로 보입니다. –

2

을하는 데 도움이

희망은 테스트 동안 ACL 플러그인 (또는 플러그인)을 대체 할 스텁을 만드는 또 다른 방법입니다. 이것을 ControllerTestCase에 넣고 테스트 케이스 setUp에서 호출하십시오.

이렇게하면 스텁 preDispatch 메서드가 호출되어 실제 액세스 제어 검사를 무시합니다.