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

PHPUnit @dataProvider просто не работает

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

Здесь функция, реализующая поставщик данных:

/**
 * Test the createGroup function
 *
 * @return void
 * @author Tomas Sandven <[email protected]>
 *
 * @dataProvider provideFileImportTests_good
 **/
public function testCreateGroup($file, $groupname, $group, $mapping)
{
    // Create a test group
    $id = $this->odm->createGroup($groupname, $group);

    // Try to load it back out
    $result = R::load(OmniDataManager::TABLE_GROUP, $id);

    // Check that the result is not null
    $this->assertFalse(is_null($result));

    return $id;
}

PHPUnit просто терпит неудачу:

Отсутствует аргумент 1 для тестов\широкоформатный\широкоформатный\OmniDataManagerTest:: testCreateGroup()

Я попытался убить приложение (die();) внутри функции поставщика данных, и этого никогда не произойдет. Функция поставщика данных доступна публично в том же классе, в имени функции нет опечаток, а функция testCreateGroup ссылается на нее в аннотации комментария, но функция поставщика данных никогда не вызывается.

Пожалуйста, объясните, почему

Спасибо

4b9b3361

Ответ 1

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

Чтобы исправить это, просто вызовите родительский конструктор. Вот как это выглядело в моем случае:

public function __construct()
{
    // Truncate the OmniDataManager tables
    R::wipe(OmniDataManager::TABLE_GROUP);
    R::wipe(OmniDataManager::TABLE_DATA);

    parent::__construct();   // <- Necessary
}

Ответ 2

Если вам это действительно нужно, у Дэвида Харкнесса был правильный совет. Здесь код:

public function __construct($name = NULL, array $data = array(), $dataName = '') {
    $this->preSetUp();
    parent::__construct($name, $data, $dataName);
}

Ответ 3

Для меня только сработал конструктор. Вызов родительского конструктора внутри моего теста класса также уничтожил аннотации, даже с последней стабильной версией PHPUnit (6.0.9).

Я только что переместил код, который у меня был на __constructor, на функцию setUp, которая вызывается до запуска моих модульных тестов.

Ответ 4

Эта ошибка означает, что по крайней мере один из массивов данных, возвращаемых вашим методом поставщика данных, пуст. Например:

public function dataProvider() {
    return array(
        array(1, 2, 3),
        array(),           // this will cause a "Missing argument 1" error
        array(4, 5, 6)
    );
}

Поскольку вы генерируете массивы данных динамически, вам нужно отладить ваши источники данных и выяснить, почему это будет так.

Ответ 5

Убедитесь, что dataProvider указан правильно... @dataProvidor vs @dataProvider

В тестовой функции, которая нужна поставщик данных, необходим док-блок, содержащий

/**
* @dataProvider providerItCanTest
*//

Ответ 6

Привет всем, кто добирается сюда из Google:) Я использую PHP 7.0.5 и PHPUnit 5.3.2.

Как упоминает @hubro - не используйте __construct(), поскольку он прерывает некоторые аннотации PHPUnit. Здесь является протектором SO с более подробной информацией.

Мой тестовый класс MyStuffTest, расширяет MyFancyTestcase, который расширяет PHPUnit_Framework_TestCase. MyFancyTestcase используется __construct(), и я получил ту же ошибку. Он должен использовать setupBeforeClass() вместо этого, чтобы установить статические данные, общие для всех тестовых случаев - соединение db и т.д., Не нужно __construct(). DataProvider работает сейчас.

Ответ 7

Чтобы подчеркнуть то, что сделано micro_user, аннотация @dataProvider должна быть в комментарии докблока. т.е. сделать это:

/**
 * @dataProvider myDataProvider
 *
 */
public function testMyMethod(...)
{
  ...
}

Не делайте этого, так как он не будет работать:

/*
 * @dataProvider myDataProvider
 *
 */
public function testMyMethod(...)
{
  ...
}