phpstan / phpstan-phpunit

PHPUnit extensions and rules for PHPStan
MIT License
450 stars 46 forks source link

Call to method PHPUnit\Framework\Assert::assertSame() with {int} and int will always evaluate to false. #64

Open teohhanhui opened 4 years ago

teohhanhui commented 4 years ago

Given this class:

<?php
declare(strict_types=1);

namespace ApiPlatform\Core\Identifier\Normalizer;

use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;

final class IntegerDenormalizer implements DenormalizerInterface
{
    public function denormalize($data, $class, $format = null, array $context = []): int
    {
        return (int) $data;
    }
}

And calling assertSame like this:

<?php

declare(strict_types=1);

namespace ApiPlatform\Core\Tests\Identifier\Normalizer;

use ApiPlatform\Core\Identifier\Normalizer\IntegerDenormalizer;
use PHPUnit\Framework\TestCase;

class IntegerDenormalizerTest extends TestCase
{
    public function testDenormalize()
    {
        $this->assertSame(2, (new IntegerDenormalizer())->denormalize('2', 'int'));
    }
}

Gives an error such as:

 ------ ----------------------------------------------------------------------------------------------------- 
  Line   tests/Identifier/Normalizer/IntegerDenormalizerTest.php                                              
 ------ ----------------------------------------------------------------------------------------------------- 
  26     Call to method PHPUnit\Framework\Assert::assertSame() with 2 and int will always evaluate to false.  
 ------ -----------------------------------------------------------------------------------------------------
mabar commented 2 years ago

I ran into the same issue with assertSame()

use PHPUnit\Framework\TestCase;

final class Test extends TestCase
{
    public function test(): void
    {
        touch('/file');
        $handle = fopen('/file', 'rwb');
        self::assertSame(0, fwrite($handle, 'data'));
        self::assertSame('data', fread($handle, 2));
    }
}
Call to static method PHPUnit\Framework\Assert::assertSame() with 0 and int<0, max>|false will always evaluate to true.
Call to static method PHPUnit\Framework\Assert::assertSame() with 'data' and string|false will always evaluate to true.