Один вопрос вкратце: может ли phpunit использовать несколько поставщиков данных при запуске теста?
Например, у меня есть метод, называемый getById, и мне нужно запустить для него как успешные, так и неудачные тестовые файлы.
Успешные тестовые окна означают, что он может вернуть соответствующую запись. И для неудачного ввода вход может быть разделен на две категории: недействителен и не выполнен.
Недопустимый означает, что вход не является законным, а сбой означает, что вход может быть действительным, но соответствующая запись с этим идентификатором отсутствует.
Таким образом, код выглядит следующим образом:
/** * @dataProvider provideInvalidId * @dataProvider provideFailedId */ public function testGetByIdUnsuccess($id) { $this->assertNull($this->model->getById($id)); }
Но оказалось, что использовался только первый поставщик данных, игнорируя второй. Хотя я не уверен, что этот сенарио распространен или нет, но вот вопрос. Можем ли мы использовать несколько поставщиков данных? И если мы можем, как?
PS: не нашел слишком много помощи здесь
Вы можете использовать вспомогательную функцию, как показано ниже. Единственная проблема заключается в том, что общее количество тестовых случаев, предоставляемых всеми «поставщиками вспомогательных данных», велико, может оказаться утомительным выяснить, какой из тестовых примеров вызывает проблему.
/** * @dataProvider allIds */ public function testGetByIdUnsuccess($id) { $this->assertNull($this->model->getById($id)); } public function allIds() { return array_merge(provideInvalidId(),provideFailedId()); }
Просто обновление вопроса, был принят запрос на перенос, и теперь код:
/** * @dataProvider provideInvalidId * @dataProvider provideFailedId */ public function testGetByIdUnsuccess($id) { $this->assertNull($this->model->getById($id)); }
Будет работать на PHPUnit 5.7, вы сможете добавить столько поставщиков, сколько захотите.
Вы можете добавить комментарий к вашему массиву dataProvider, чтобы обеспечить ту же функциональность, не требуя нескольких dataProviders.
public static function DataProvider() { return array( 'Invalid Id' => array(123), 'Failed Id' => array(321), 'Id Not Provided' => array(NULL), ); }
ну, вы могли бы подумать об этом с другой стороны;) вы точно знаете, что вы ожидаете, например getById (1) ожидаемый результат: $ result_expected, а не $ result_null, так что вы могли бы сделать dataprovider как это
$dataProvider = array(1, 'unexpected');
то ваш тестовый метод выглядит следующим образом:
public function testGetById($id) { $this->assertEquals($result_expected, $obj::getById($id)); }
поэтому, результат теста:
.F