2012-04-16 4 views
26

Я прочитал документацию по этой теме, и мой код соответствует всем требованиям реализации поставщика данных. Прежде всего, here's the full code of the test на всякий случай это актуально.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 для испытаний \ Broadnet \ broadmap \ OmniDataManagerTest :: testCreateGroup()

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

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

Благодарности

ответ

60

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

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

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

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

Вы также назвали parent :: __ constructor()? Как правило, вы не определяете конструктор для тестового окна, но используете функцию setUp(). –

+1

Мне понадобился код, который нужно выполнить один раз перед началом любого из тестов. Нет, я не называл 'parent :: __ constructor()' ... Я заменил конструктор 'function setUpBeforeClass' в любом случае. Это проблематично, что он должен быть статичным, но, к счастью, мне не нужно было размещать что-либо в нем – Hubro

+8

У вас может быть пользовательский конструктор, но вы должны позаботиться о том, чтобы принять те же параметры и передать их родительскому конструктору. –

2

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

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

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

+0

Как поставщик данных может возвращать пустой массив данных, если * он никогда не называл * – Hubro

+0

Я скопировал провайдера в новый тестовый класс, и он сработал. Проблема находится где-то еще в классе – Hubro

+0

@Codemonkey: Если сообщение об ошибке, которое вы указали, связано с ошибкой теста (что я не могу сказать, потому что вы не вставили контекст), тогда это может произойти только в том случае, если набор данных, предоставленный для метод проверки пуст. Единственные другие способы, с помощью которых я могу думать о том, чтобы получить такое сообщение об ошибке, потребуют от вас вручную вызывать 'testCreateGroup()' себя где-то внутри вашего кода (и, следовательно, не передавать требуемые аргументы) , или тест, вызываемый PHPUnit, без обработки, как если бы у него был поставщик данных (что указывало бы на проблему в вашей аннотации). – FtDRbwLXw6

38

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

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

+1, это должно быть отмечено как правильный ответ – danielperaza

+3

Это специально решило это для меня тоже, вызывая parent :: construct() без параметров, нет. Спасибо – scipilot

+0

Ты спасатель! Спасибо! – artsylar

2

Убедитесь, что DataProvider пишется правильно ... @dataProvidor против @dataProvider

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

/** 
* @dataProvider providerItCanTest 
*// 
0

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

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

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

+0

Прежде всего, я не говорю «не используйте' __construct() '», я сказал, что нужно вызвать родительскую функцию или она нарушит функциональность класса. Кроме того, статическая функция установки не может заменить все варианты использования '__construct()'. – Hubro

5

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

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

1

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

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

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

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

вы сохранили день – animaacija

+0

Рад его услышать. :-) – darrenp

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