2013-02-28 2 views
22

Один вопрос вкратце: может ли phpunit использовать несколько поставщиков данных при запуске теста?Может ли phpunit использовать несколько поставщиков данных

Например, у меня есть метод getById, и для этого мне нужно запустить как успешные, так и неудачные тестовые файлы.

Успешные тестовые окна означают, что он может вернуть соответствующую запись. И для неудачного ввода вход может быть разделен на две категории: недействителен и не выполнен.

Недопустимое означает, что вход не является законным, а сбой означает, что вход может быть действительным, но соответствующая запись с этим идентификатором отсутствует.

Поэтому код выглядит следующим образом:

/** 
* @dataProvider provideInvalidId 
* @dataProvider provideFailedId 
*/ 
public function testGetByIdUnsuccess($id) 
{ 
    $this->assertNull($this->model->getById($id)); 
} 

Но оказалось, что только первый поставщик данных был использован, не обращая внимания на второй. Хотя я не уверен, что этот сенарио распространен или нет, но вот вопрос. Можем ли мы использовать несколько поставщиков данных? И если мы можем, как?

PS: не нашла слишком много помощи в here

+0

Я нахожусь в аналогичной ситуации, когда отдельные поставщики данных сделают код более читаемым (например, документирование кода и тестовых примеров через предоставленные им данные). Интересно, какая была бы лучшая практика? – Pitt

ответ

2

Вы можете добавить комментарий в массив DataProvider, чтобы обеспечить такую ​​же функциональность, не требуя несколько dataProviders.

public static function DataProvider() 
{ 
    return array(
     'Invalid Id'  => array(123), 
     'Failed Id'  => array(321), 
     'Id Not Provided' => array(NULL), 
); 
} 
14

Вы можете использовать вспомогательную функцию, как показано ниже. Единственная проблема заключается в том, что общее количество тестовых случаев, предоставляемых всеми «поставщиками вспомогательных данных», велико, может оказаться утомительным выяснить, какой из тестовых примеров вызывает проблему.

/** 
* @dataProvider allIds 
*/ 
public function testGetByIdUnsuccess($id) 
{ 
    $this->assertNull($this->model->getById($id)); 
} 

public function allIds() 
{ 
    return array_merge(provideInvalidId(),provideFailedId()); 
} 
0

хорошо, вы могли бы рассмотреть его с другой стороны;) вы точно знаете, что ваш ожидается, к примеру GetByID (1) ожидаемый результат result_expected $, а не $ result_null так, вы могли бы сделать DataProvider как этот

$dataProvider = array(1, 'unexpected'); 

то, что ваш метод испытания, как это:

public function testGetById($id) { 
    $this->assertEquals($result_expected, $obj::getById($id)); 
} 

так, тест результат:

.F 
11

Просто обновление на вопрос, pull request был принят и теперь код:

/** 
* @dataProvider provideInvalidId 
* @dataProvider provideFailedId 
*/ 
public function testGetByIdUnsuccess($id) 
{ 
    $this->assertNull($this->model->getById($id)); 
} 

будет работать на PHPUnit 5.7, вы сможете добавить столько поставщиков, сколько вы хотите.

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