2012-12-19 5 views
0

테스트가 많이 있지만 실제로 테스트 한 일부 오브젝트가 실패하고 그 이유를 모르겠습니다. 간단한 테스트에서 코드를 단계별로 실행하면 테스트하려는 내용이 정의되어 있지만 PHPUnit이 테스트에 실패 함을 알 수 있습니다.내부 배열이 설정된 경우 PHPUnit 테스트가 실패합니다.

너무 작은 잡음없이 문제를 설명하기 위해 아래에 편집 된 작은 코드 샘플이 있습니다.

클래스 정의의 매우 간단한 하위 집합입니다.

class UTIL_CATEGORY_SCOPE extends UTIL_MESSAGE_DATA 
{ 
    function __construct($CategoryNo = NULL, $CategoryName = NULL) 
    { 
     $this->DeclareClassFields_(); 

     $this->CategoryName = $CategoryName; 
     $this->CategoryNo = $CategoryNo; 
    } 

    private function DeclareClassFields_() 
    { 
     $this->Fields['CategoryNo']    = new UTIL_ICAP_FIELD('CCL', 6, 'Category', 8); 
     $this->Fields['SubCategoryNo']   = new UTIL_ICAP_FIELD('SCC', 6, 'Sub-Category', 12); 
     $this->Fields['SubSubCategoryNo']  = new UTIL_ICAP_FIELD('SSC', 6, 'Sub-Sub-Category', 12); 
    } 
} 

정상적인 코드는 Netbeans 디버거에서 작동합니다.

$Category = new UTIL_CATEGORY_SCOPE(); 

PHPUnit 테스트 샘플 비교를위한 덤프 내용입니다.

var_dump($Category); 

class UTIL_CATEGORY_SCOPE#1 (4) { 
    public $TheMessage_ => 
    class MESSAGE_DATA#2 (0) { 
    } 

괜찮습니다. InstanceOf 클래스를 테스트하고 올바르게 전달할 수 있기를 기대하고 작동합니다.

내부적으로 클래스 객체의 배열이며 get/set 값 등의 마법 메서드를 사용하는 배열의 필드 목록이 있습니다. 배열이 초기화 되었습니까?

var_dump($Category->Fields); 

array(3) { 
    'CategoryNo' => 
     class UTIL_ICAP_FIELD#3 (14) { 
      public $FieldCode => 
       string(3) "CCL" 
      public $FieldLength => 
       int(6) 
      public $FieldTitle => 
       string(8) "Category" 
     } 
    'SubCategoryNo' => 
     class UTIL_ICAP_FIELD#4 (14) { 
      public $FieldCode => 
       string(3) "SCC" 
      public $FieldLength => 
       int(6) 
      public $FieldTitle => 
       string(12) "Sub-Category" 
     } 
    'SubSubCategoryNo' => 
     class UTIL_ICAP_FIELD#5 (14) { 
      public $FieldCode => 
       string(3) "SSC" 
      public $FieldLength => 
       int(6) 
      public $FieldTitle => 
       string(16) "Sub-Sub-Category" 
     } 
    }   

배열이 예상대로 초기화됩니다.
배열이 존재하고 개별 항목에 액세스 할 수 있는지 확인하십시오.

if (array_key_exists('CategoryNo', $Category->Fields)) 
    echo 'Array Key Exists'; 

    Array Key Exists 

if($Category->Fields['CategoryNo'] instanceof UTIL_ICAP_FIELD) 
    echo 'Yes'; 

Yes 

모두 예상대로보고됩니다. 부분

phpunit을 시험 예상대로

class TEST_UTIL_CATEGORY_SCOPE extends PHPUnit_Framework_TestCase 
{ 
    protected function setUp() 
    { 
    } 

    public function testObjectCreation() 
    { 
     $CategoryInfo = new UTIL_CATEGORY_SCOPE(); 
     $this->assertInstanceOf('UTIL_CATEGORY_SCOPE', $CategoryInfo); 
     $this->assertInstanceOf('UTIL_DATA_STRUCTURE', $CategoryInfo); 
    } 

    public function testConstructFieldOrder() 
    { 
     $CategoryInfo = new UTIL_CATEGORY_SCOPE(1500, 'Category Name'); 
     $this->assertEquals(1500, $CategoryInfo->CategoryNo); 
     $this->assertEquals('Category Name', $CategoryInfo->CategoryName); 
    } 

    /** 
    * 
    */ 
    public function testConstructDefaults() 
    { 
     $CategoryInfo = new UTIL_CATEGORY_SCOPE(); 
     $this->assertNull($CategoryInfo->CategoryNo); 
     $this->assertNull($CategoryInfo->CategoryName); 
    } 

이러한 테스트는 통과. 그러나 위의 정보 덤프를 감안할 때 테스트 실행 및 var_dump가 값이 초기화되고 예상대로 표시 되었음에도 불구하고 다음 2 가지 테스트가 실패합니다.

public function testFieldsCreated() 
    { 
     $CategoryInfo = new UTIL_CATEGORY_SCOPE(); 
     $this->assertArrayHasKey('CategoryNo', $CategoryInfo->Fields); 
     $this->assertArrayHasKey('SubCategoryNo', $CategoryInfo->Fields); 
     $this->assertArrayHasKey('SubSubCategoryNo', $CategoryInfo->Fields); 
    } 

오류 만든 :

1) TEST_UTIL_CATEGORY_SCOPE::testFieldsCreated 
Failed asserting that an array has the key 'CategoryNo'. 

다음 테스트

public function testICAPFieldTypes() 
    { 
     $CategoryInfo = new UTIL_CATEGORY_SCOPE(); 
     $this->assertInstanceOf('UTIL_ICAP_FIELD', $CategoryInfo->Fields['CategoryNo']); 
     $this->assertInstanceOf('UTIL_ICAP_FIELD', $CategoryInfo->Fields['SubCategoryNo']); 
     $this->assertInstanceOf('UTIL_ICAP_FIELD', $CategoryInfo->Fields['SubSubCategoryNo']); 
    } 

을 오류 만든 :

2) TEST_UTIL_CATEGORY_SCOPE::testICAPFieldTypes 
Failed asserting that null is an instance of class "UTIL_ICAP_FIELD". 

내가 때 내가 할 수있는이 오류가 발생으로 계속하는 방법을 잘 모르겠습니다 그 물건들이 크레아인지 확인해. 테드, 내가 예상했던대로 배열 채워집니다. 테스트 스위트를 계속 사용하려면이 테스트를 지금은 불완전한 것으로 표시해야합니다.

누구에게 아이디어가 있습니까?

+0

받고있는 오류 메시지는 무엇입니까? 그 클래스는 언제든지 이름 공간을 차지합니까? – edorian

+0

아니요. 우리는 PHP 5.3.17과 PHPUnit 3.6.10을 테스트 중입니다. 그러나 우리 릴리스 코드는 실제로 PHP 5.2.17에서 실행되기 때문에 이름 공간이 없습니다. 생성 된 오류를 포함하도록 설명을 업데이트했습니다. –

답변

0

수업을 자세히 조사한 후 해결책을 찾았습니다. 액세스하려고 시도한 배열이 PROTECTED로 정의되었으므로 PHPUnit Test Framework에서 값에 액세스 할 수 없습니다.

해결 방법은 두 가지가 있습니다.

  1. 배열을 PUBLIC으로 액세스 가능하게 선언하십시오.

  2. 테스트에서 리플렉션을 사용하면 테스트에만 액세스 할 수 있습니다.

옵션 2가 가장 선호되는 솔루션이지만, 프로젝트의 즉각적인 필요와 다른 변경 시간을 위해 옵션 1 (PUBLIC)이 일시적으로 사용되었습니다.

내 문제를 해결하는 데 도움을 주신 분께 감사드립니다.

관련 문제