2010-10-07 30 views
5

Đây là phpunit tôi kiểm tra tập tinphpunit chạy kiểm tra hai lần - nhận được hai câu trả lời. Tại sao?

<?php // DemoTest - test to prove the point 

function __autoload($className) { 
    // pick file up from current directory 
    $f = $className.'.php'; 
    require_once $f; 
} 

class DemoTest extends PHPUnit_Framework_TestCase { 
    // call same test twice - det different results 
    function test01() { 
     $this->controller = new demo(); 
     ob_start(); 
     $this->controller->handleit(); 
     $result = ob_get_clean(); 
     $expect = 'Actions is an array'; 
     $this->assertEquals($expect,$result); 
    } 

    function test02() { 
     $this->test01(); 
    } 
} 
?> 

Đây là tập tin dưới sự kiểm tra

<?php // demo.php 
global $actions; 
$actions=array('one','two','three'); 
class demo { 
    function handleit() { 
     global $actions; 
     if (is_null($actions)) { 
      print "Actions is null"; 
     } else { 
      print('Actions is an array'); 
     } 
    } 
} 
?> 

Kết quả là thử nghiệm thứ hai thất bại vì $ hành động là null.

Câu hỏi của tôi là - tại sao tôi không nhận được kết quả tương tự cho hai thử nghiệm?

Đây có phải là một lỗi trong phpunit hoặc đó là sự hiểu biết của tôi về php?

Trả lời

3

PHPUnit có một tính năng được gọi là "globals sao lưu", nếu được bật, sau đó vào đầu thử nghiệm tất cả các biến trong phạm vi toàn cầu được sao lưu (ảnh chụp được thực hiện từ các giá trị hiện tại) và sau mỗi lần kiểm tra được hoàn thành, các giá trị sẽ được khôi phục lại các giá trị ban đầu. Bạn có thể đọc thêm về điều đó tại đây: http://sebastian-bergmann.de/archives/797-Global-Variables-and-PHPUnit.html#content

Bây giờ, hãy xem bộ thử nghiệm của bạn.

  1. test01 được chuẩn bị
  2. sao lưu được làm bằng tất cả các biến toàn cầu (vào thời điểm này $ hành động trong phạm vi toàn cầu không được thiết lập, vì mã đã không chạy chưa)
  3. test01 chạy
  4. demo. php được bao gồm (nhờ tự động tải) và hành động $ được đặt trong phạm vi toàn cầu
  5. xác nhận của bạn thành công, vì $ action được đặt trong phạm vi toàn cầu
  6. test01 bị rách. biến toàn cầu được trả về giá trị ban đầu của chúng. $ actions trong phạm vi toàn cầu là bị hủy tại thời điểm này, bởi vì nó được đặt bên trong kiểm tra, nó không phải là một phần của trạng thái toàn cầu trước khi bắt đầu kiểm tra
  7. test02 chạy .. và không thành công, vì có không có $ hành động trong phạm vi toàn cầu.

Sửa lỗi trực tiếp cho vấn đề của bạn: bao gồm demo.php ở đầu DemoTest.php, cách này $ actions kết thúc trong phạm vi toàn cầu được sao lưu và khôi phục trước và sau mỗi lần kiểm tra.

Sửa chữa dài hạn: cố gắng tránh sử dụng hình cầu. Thói quen xấu của nó và luôn luôn có những giải pháp tốt hơn so với nhà nước toàn cầu sử dụng 'toàn cầu'.

+1

Thật là một câu trả lời tuyệt vời - cảm ơn bạn. Nó làm cho sence bây giờ. – Ian

Các vấn đề liên quan