Skip to content

Commit 985227d

Browse files
Ensure return value of data provider method is iterable
1 parent 8aba377 commit 985227d

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

src/Metadata/Api/DataProvider.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use function get_debug_type;
1616
use function is_array;
1717
use function is_int;
18+
use function is_iterable;
1819
use function is_string;
1920
use function method_exists;
2021
use function sprintf;
@@ -134,6 +135,16 @@ private function dataProvidedByMethods(ReflectionMethod $testMethod, MetadataCol
134135

135136
/** @phpstan-ignore staticMethod.dynamicName */
136137
$data = $className::$methodName();
138+
139+
if (!is_iterable($data)) {
140+
throw new InvalidDataProviderException(
141+
sprintf(
142+
'Data Provider method %s::%s() does not return an iterable',
143+
$_dataProvider->className(),
144+
$_dataProvider->methodName(),
145+
),
146+
);
147+
}
137148
} catch (Throwable $e) {
138149
Event\Facade::emitter()->dataProviderMethodFinished(
139150
$testMethodValueObject,
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php declare(strict_types=1);
2+
/*
3+
* This file is part of PHPUnit.
4+
*
5+
* (c) Sebastian Bergmann <[email protected]>
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
namespace PHPUnit\TestFixture\Event;
11+
12+
use PHPUnit\Framework\Attributes\DataProvider;
13+
use PHPUnit\Framework\TestCase;
14+
15+
final class DataProviderNotIterableTest extends TestCase
16+
{
17+
public static function provider(): string
18+
{
19+
return 'string';
20+
}
21+
22+
#[DataProvider('provider')]
23+
public function testSomething(bool $value): void
24+
{
25+
$this->assertTrue($value);
26+
}
27+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--TEST--
2+
The right events are emitted in the right order for a test that uses a data provider that does not return an iterable
3+
--FILE--
4+
<?php declare(strict_types=1);
5+
$_SERVER['argv'][] = '--do-not-cache-result';
6+
$_SERVER['argv'][] = '--no-configuration';
7+
$_SERVER['argv'][] = '--debug';
8+
$_SERVER['argv'][] = __DIR__ . '/_files/DataProviderNotIterableTest.php';
9+
10+
require __DIR__ . '/../../bootstrap.php';
11+
12+
(new PHPUnit\TextUI\Application)->run($_SERVER['argv']);
13+
--EXPECTF--
14+
PHPUnit Started (PHPUnit %s using %s)
15+
Test Runner Configured
16+
Event Facade Sealed
17+
Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderNotIterableTest::provider for test method PHPUnit\TestFixture\Event\DataProviderNotIterableTest::testSomething)
18+
Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderNotIterableTest::testSomething:
19+
- PHPUnit\TestFixture\Event\DataProviderNotIterableTest::provider
20+
Test Triggered PHPUnit Error (PHPUnit\TestFixture\Event\DataProviderNotIterableTest::testSomething)
21+
The data provider PHPUnit\TestFixture\Event\DataProviderNotIterableTest::provider specified for PHPUnit\TestFixture\Event\DataProviderNotIterableTest::testSomething is invalid
22+
Data Provider method PHPUnit\TestFixture\Event\DataProviderNotIterableTest::provider() does not return an iterable
23+
Test Runner Triggered Warning (No tests found in class "PHPUnit\TestFixture\Event\DataProviderNotIterableTest".)
24+
Test Suite Loaded (0 tests)
25+
Test Runner Started
26+
Test Suite Sorted
27+
Test Runner Execution Started (0 tests)
28+
Test Runner Execution Finished
29+
Test Runner Finished
30+
PHPUnit Finished (Shell Exit Code: 2)

0 commit comments

Comments
 (0)