diff --git a/packages/PhpSpecToPHPUnit/src/Rector/Class_/PhpSpecClassToPHPUnitClassRector.php b/packages/PhpSpecToPHPUnit/src/Rector/Class_/PhpSpecClassToPHPUnitClassRector.php index 9ddcc1c7cc11..d3583fc35a2b 100644 --- a/packages/PhpSpecToPHPUnit/src/Rector/Class_/PhpSpecClassToPHPUnitClassRector.php +++ b/packages/PhpSpecToPHPUnit/src/Rector/Class_/PhpSpecClassToPHPUnitClassRector.php @@ -2,11 +2,12 @@ namespace Rector\PhpSpecToPHPUnit\Rector\Class_; -use PhpParser\Builder\Method; +use PhpParser\Comment\Doc; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\Clone_; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; @@ -195,8 +196,23 @@ private function processBeConstructed(ClassMethod $classMethod): void throw new ShouldNotHappenException(); } - $assign = new Assign($param->var, new New_($param->type)); - $assigns[] = new Expression($assign); + $methodCall = new MethodCall(new Variable('this'), 'createMock'); + $methodCall->args[] = new Arg(new ClassConstFetch(new FullyQualified($param->type), 'class')); + + $varDoc = sprintf( + '/** @var \%s|\%s $%s */', + $this->getName($param->type), + 'PHPUnit\Framework\MockObject\MockObject', + $this->getName($param->var) + ); + + $assign = new Assign($param->var, $methodCall); + + // add @var doc comment + $assignExpression = new Expression($assign); + $assignExpression->setDocComment(new Doc($varDoc)); + + $assigns[] = $assignExpression; } $classMethod->params = []; @@ -318,6 +334,11 @@ private function processTestMethod(ClassMethod $classMethod): void } if ($node->var instanceof Variable && $this->isName($node->var, 'this')) { + // skip "createMock" method + if ($this->isName($node, 'createMock')) { + return $node; + } + // $this->clone() ↓ // clone $this->testedObject if ($this->isName($node, 'clone')) { diff --git a/packages/PhpSpecToPHPUnit/tests/Rector/Class_/PhpSpecClassToPHPUnitClassRector/Fixture/let_create_edge.php.inc b/packages/PhpSpecToPHPUnit/tests/Rector/Class_/PhpSpecClassToPHPUnitClassRector/Fixture/let_create_edge.php.inc index 69fba0d6d03a..b1799ed61dab 100644 --- a/packages/PhpSpecToPHPUnit/tests/Rector/Class_/PhpSpecClassToPHPUnitClassRector/Fixture/let_create_edge.php.inc +++ b/packages/PhpSpecToPHPUnit/tests/Rector/Class_/PhpSpecClassToPHPUnitClassRector/Fixture/let_create_edge.php.inc @@ -38,14 +38,16 @@ class CurrencyTest extends \PHPUnit\Framework\TestCase private $currency; protected function setUp() { - $data = new CurrencyData(); + /** @var \spec\Rector\PhpSpecToPHPUnit\Tests\Rector\Class_\PhpSpecClassToPHPUnitClassRector\Fixture\CurrencyData|\PHPUnit\Framework\MockObject\MockObject $data */ + $data = $this->createMock(\spec\Rector\PhpSpecToPHPUnit\Tests\Rector\Class_\PhpSpecClassToPHPUnitClassRector\Fixture\CurrencyData::class); $data->code = 'CZK'; $this->currency = \Rector\PhpSpecToPHPUnit\Tests\Rector\Class_\PhpSpecClassToPHPUnitClassRector\Fixture\Currency::create([$data]); } public function testNotBeConstructedWithoutCode() { - $data = new CurrencyData(); + /** @var \spec\Rector\PhpSpecToPHPUnit\Tests\Rector\Class_\PhpSpecClassToPHPUnitClassRector\Fixture\CurrencyData|\PHPUnit\Framework\MockObject\MockObject $data */ + $data = $this->createMock(\spec\Rector\PhpSpecToPHPUnit\Tests\Rector\Class_\PhpSpecClassToPHPUnitClassRector\Fixture\CurrencyData::class); $data->code = ''; $this->expectException(ValidationException::class); $this->currency = \Rector\PhpSpecToPHPUnit\Tests\Rector\Class_\PhpSpecClassToPHPUnitClassRector\Fixture\Currency::create([$data]);