Подтвердить что ты не робот

Может ли phpunit использовать несколько поставщиков данных?

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

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

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

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

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

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

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

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

4b9b3361

Ответ 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']]
    );
}