diff --git a/rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/Fixture/skip_used_in_yield.php.inc b/rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/Fixture/skip_used_in_yield.php.inc new file mode 100644 index 00000000..7f6a22b0 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/Fixture/skip_used_in_yield.php.inc @@ -0,0 +1,24 @@ +mockProperty = $this->createMock(\stdClass::class); + $this->mockProperty->expects($this->once()) + ->method('someMethod') + ->willReturn('someValue'); + + $someValue = new RewindableGenerator(fn () => yield from [$this->mockProperty], 1); + } +} diff --git a/rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/config/configured_rule.php b/rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/config/configured_rule.php index 9e3f1712..aae1915f 100644 --- a/rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/config/configured_rule.php +++ b/rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/config/configured_rule.php @@ -5,6 +5,5 @@ use Rector\Config\RectorConfig; use Rector\PHPUnit\CodeQuality\Rector\Class_\RemoveNeverUsedMockPropertyRector; -return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rule(RemoveNeverUsedMockPropertyRector::class); -}; +return RectorConfig::configure() + ->withRules([RemoveNeverUsedMockPropertyRector::class]); diff --git a/rules/CodeQuality/NodeAnalyser/MockObjectExprDetector.php b/rules/CodeQuality/NodeAnalyser/MockObjectExprDetector.php index 641c1ecd..ea078d66 100644 --- a/rules/CodeQuality/NodeAnalyser/MockObjectExprDetector.php +++ b/rules/CodeQuality/NodeAnalyser/MockObjectExprDetector.php @@ -5,6 +5,7 @@ namespace Rector\PHPUnit\CodeQuality\NodeAnalyser; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\CallLike; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\PropertyFetch; @@ -127,6 +128,21 @@ public function isPropertyMockObjectPassedAsArgument(Class_ $class, string $prop } } + /** @var array $arrays */ + $arrays = $this->betterNodeFinder->findInstancesOfScoped($class->getMethods(), [Array_::class]); + foreach ($arrays as $array) { + foreach ($array->items as $arrayItem) { + if (! $arrayItem->value instanceof PropertyFetch) { + continue; + } + + $propertyFetch = $arrayItem->value; + if ($this->nodeNameResolver->isName($propertyFetch->name, $propertyName)) { + return true; + } + } + } + return false; } } diff --git a/rules/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector.php b/rules/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector.php index b7de62d3..9eb38bfc 100644 --- a/rules/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector.php +++ b/rules/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector.php @@ -48,6 +48,7 @@ final class SomeTest extends TestCase protected function setUp(): void { $this->mockProperty = $this->createMock(SomeClass::class); + $this->mockProperty->expects($this->once()) ->method('someMethod') ->willReturn('someValue'); @@ -96,6 +97,7 @@ public function refactor(Node $node): ?Node $propertyNamesToCreateMockMethodCalls = $this->mockObjectPropertyDetector->collectFromClassMethod( $setUpClassMethod ); + if ($propertyNamesToCreateMockMethodCalls === []) { return null; }