2010-07-28 26 views
9

Tôi có một ứng dụng đứng sau đăng nhập và sử dụng zend_acl và zend_auth.Kiểm tra đơn vị PHP với Zend Auth và Zend ACL

Trong quá trình gửi trước, tôi có một plugin ACL tạo tất cả các quy tắc cho ACL. Tôi cũng có một plugin Auth để kiểm tra xem bạn có đăng nhập hay không và nếu vậy bạn có quyền truy cập vào tài nguyên được yêu cầu theo ACL.

Do việc áp dụng là hoàn toàn sau đăng nhập ACL chỉ được tạo ra nếu bạn đang đăng nhập.

Đơn vị kiểm tra này dường như là không thể, hay đúng hơn là nhiều khả năng tôi là thiếu một cái gì đó rõ ràng.

Trong phương pháp thiết lập thử nghiệm đơn vị của tôi, tôi mô phỏng thông tin đăng nhập thành công trả về phiên bản zend_auth. Các thử nghiệm vượt qua cho biết rằng thông tin đăng nhập này đã thành công.

Tuy nhiên, nếu sau đó, thông qua các bài kiểm tra cố gắng gửi đến vị trí khác hoặc đánh giá xem người dùng đã đăng nhập có quyền truy cập vào tài nguyên đã cho hay không thì plugin luôn bị plugin từ chối vì họ vẫn chưa đăng nhập. chắc chắn tại sao điều này là, bất cứ ai có thể tư vấn cho?

Ví dụ này đi:

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

này thất bại vì nó bị từ chối bởi các plugin:

public function testUserAccess() 
{ 

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

} 

này, tôi đã tìm thấy vẫn dường như được chuyển hướng trở lại trang đăng nhập như các plugin không biết người dùng đã đăng nhập.

Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

3

Vấn đề bạn mô tả xảy ra rất nhiều với việc sử dụng các biến toàn cầu và biến toàn cục OOP (mẫu Singleton).

Có một bài viết của tác giả của PHPUnit mô tả làm thế nào bạn có thể tránh điều đó bằng cách sử dụng Dependency Injection và những gì khả năng khác mà bạn đã có và vì nó rất mô tả, tôi chỉ đề nghị bạn đọc nó :) http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

Là một giải pháp thay thế xấu (nếu bạn cần kết quả nhanh), bạn có thể tạo một nhánh của Zend_Auth (mô tả trong liên kết) và sử dụng API phản chiếu PHP 5.3 để đặt biến thể Zend_Auth thành nhánh của bạn.

Hy vọng rằng sẽ giúp (như câu hỏi sống 4h mà không có một câu trả lời khác)

+0

Có, cảm ơn bạn dường như là vấn đề. –

2

Đây là một cách khác để tạo ra một sơ khai để thay thế ACL Plugin của bạn (hoặc bất kỳ plugin) trong thời gian thử nghiệm. Đặt điều này trong ControllerTestCase của bạn và gọi nó trong trường hợp kiểm tra thiết lập.

public function doLogin() 
{ 
    // create a fake identity 
    $identity = new stdClass(); 
    $identity->Username = 'PHPUnit'; 
    Zend_Auth::getInstance()->getStorage()->write($identity); 

    // remove the autoloaded plugin 
    $front = Zend_Controller_Front::getInstance(); 
    $front->unregisterPlugin('My_Controller_Plugin_Acl'); 

    // create the stub for the Acl class 
    $mockaAcl = $this->getMock(
     'My_Controller_Plugin_Acl', 
     array('preDispatch'), 
     array(), 
     'My_Controller_Plugin_AclMock' 
    ); 

    // register the stub acl plugin in its place 
    $front->registerPlugin($mockAcl); 
} 

Bằng cách này phương pháp sơ khai preDispatch của bạn được gọi thay vào đó, mà sẽ bỏ qua kiểm tra kiểm soát truy cập thực tế của bạn.