phpunit — как объединить 2 провайдера данных

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

Я сделал слияние массива в разделе dataProviders как

  public function provider_data() {

$data1 = $this->getData('home_data');

$data2= $this->getData('data2');

$newarray = array_merge($data1, $data2);

return $newarray;
}

Но я вижу, что мой тестовый пример выполняется дважды, и я заметил, что тестовый пример фактически выполняется для каждого массива (Data1 и Data2) отдельно, хотя они были объединены. Что я здесь не так делаю? Как мне объединить 2 провайдера данных (оба провайдера данных имеют совершенно разные форматы входных данных)

0

Решение

Вам нужно сделать что-то более глубокое, чем просто array_merge, Поставщик данных предоставляет массив, каждая запись которого представляет собой отдельный контрольный пример. Каждый тестовый пример представляет собой массив, содержащий аргументы. Вот так:

'testCase 1' => array(
0 => argument 1,
1 => argument 2
),
'testCase 2' => array(
0 => argument 1,
1 => argument 2
),

Поскольку вы сказали, что тест выполняется дважды, каждый поставщик данных должен предоставить только одну запись. array_merge добавляет второй массив поставщика данных к первому массиву, выполняя два контрольных примера. Если вы хотите объединить данные, предоставленные каждым поставщиком данных, вам нужно будет сделать что-то вроде следующего:

public function provider_data() {
$data1 = $this->getData('home_data');
$data2 = $this->getData('data2');

$testCases = array();

foreach ($data1 as $key => $arguments) {
$testCases[] = array_merge($arguments, $data2[$key]);
}

return $testCases;
}

Это берет аргументы из второго набора данных и добавляет его к аргументам в первом. Теперь ваш тест получит объединенные аргументы от обоих поставщиков данных.

Это предполагает, что оба массива данных имеют одинаковую длину. Если они могут не быть, вам нужно будет добавить некоторую логику для обработки этого случая. Также имейте в виду, что для списка аргументов PHPUnit не ссылается на ключи для сопоставления аргументов с переменной. Он основан только на порядке значений в массиве. Поэтому будьте осторожны с аргументами в вашем тестовом примере с этим.

2

Другие решения

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

    $data1 = $this->loadData('data1');
$data2 = $this->loadData('data2');
$newarray = array();
foreach($data1 as $key1 => $value1){
foreach ($data2 as $key2 => $value2) {
$newarray[] = array_merge($value2, $data1[$key1]);
}
}
return $newarray;
0

По вопросам рекламы [email protected]