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