2013-02-26 2 views
3

сейчас дни, когда я играю с PHPUnit. Я просмотрел его документацию, но я не могу это понять. Позвольте мне объяснить свое дело.Написание PHPUnit Test для функции, возвращающей массив

У меня есть функция в классе, которая принимает три параметра: 1 array, 2 some string, 3 a class object. Эта функция возвращает массив, помещая второй параметр в качестве индекса массива и результат как объект этого индекса. Моя функция как ниже

public function construct($testArray, $test,$analysisResult) { 
    $postedTest = explode('_', $test); 
    $testName = end($postedTest); 
    $postedTest = implode("_", array_slice($postedTest, 0, -1)); 
    if (in_array($postedTest, array_keys($testArray))) { 
     $testArray[$postedTest][$testName] = $analysisResult; 
    } else { 
     $testArray[$postedTest] = array($testName => $analysisResult); 
    } 
    return $testArray; 
} 

Если я называю эту функцию как

$constructObj = new Application_Model_ConstructTree(); 
    $test=$this->getMockForAbstractClass('Abstract_Result'); 
    $test->level = "Error"; 
    $test->infoText = "Not Immplemented"; 
    $testArray = Array('databaseschema' => Array('Database' => $test)); 

    $result = $constructObj->construct($testArray,"Database",$test); 

Функция возвращает массив как

Array 
(
[databaseschema] => Array 
    (
     [Database] => AnalysisResult Object 
      (
       [isRepairable] => 1 
       [level] => Error 
       [infoText] => Not Implemented 
      ) 

    ) 
) 

Теперь я хочу написать тест PHPUnit, чтобы проверить, что атрибуты объекта вроде isRepairable, level and infoText существуют и не пусты. Я подумал, что assertNotEmpty и assertAttributeEmpty могут что-то сделать. Но я не могу понять, как это сделать.

Мой тест выглядит

public function testcontruct() { 
    $constructObj = new Application_Model_ConstructTree(); 
    $test=$this->getMockForAbstractClass('Abstract_Result'); 
    $test->level = "Error"; 
    $test->infoText = "Not Immplemented"; 
    $testArray = Array('databaseschema' => Array('Database' => $test)); 

    $result = $constructObj->construct($testArray,"Database",$test); 

    $this->assertNotCount(0, $result); 
    $this->assertNotContains('databaseschema', $result); 
} 

Может кто-нибудь, пожалуйста, руководство :-)

+0

это выглядит как ваша проблема J согласитесь с утверждениями. Это происходит, когда они терпят неудачу. Следовательно, assertTrue (Condition) будет фактически только через утверждение (ошибка), когда Условие не является истинным. Утверждение происходит только при сбоях, так что они как будто пропускают «только когда результаты не являются» от имени. –

ответ

5

последняя строка должна быть assertContains вместо assertNotContains. Следующие шаги в тесте будет:

$this->assertContains('Database', $result['databaseschema']); 
$this->assertAttributeNotEmpty('isRepairable', $result['databaseschema']['Database']); 
$this->assertAttributeNotEmpty('level', $result['databaseschema']['Database']); 
$this->assertAttributeNotEmpty('infoText', $result['databaseschema']['Database']); 

assertAttributeNotEmpty принимает имя атрибута и объект в качестве параметров, так же, как assertContains берет ключ массива и массив.

+0

Спасибо, чувак. Хорошо объяснили –

3

Я хотел бы использовать assertArrayHasKey именно:

$this->assertArrayHasKey($key, $array); 

Потому что вам нужно проверить сложную структуру, что я буду делать будет каждым из ожидаемых элементов и утверждаю, что они есть, и они не пустуют с assertNotEmpty()

Я нашел это хороший пример, похожий на вашу проблему:

http://opensourceame.com/asserting-that-an-array-contains-another-array-in-phpunit/

Смежные вопросы