Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

assertNotContains appears to be messing something up.

Abierto
#262 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Necesita aclaración
Estado de actividad
Estancado
Stack tecnológico
php
Área
testing

Línea de trabajo

Start with the shortened OmegaTag and testBasic examples in the issue, focusing on the interaction between assertNotContains() and the later assertCount() call. Compare the analysis with and without assertNotContains(); done when the collection is no longer inferred as NEVER and the impossibleType warning is resolved.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

I've got a weird issue that I can't seem to figure out. I think it is a bug in PHPStan, but I'm not certain.
I appreciate if you can point me in a way on how to debug this or help you figure out what is wrong.

Some context first:

  • popped up after upgrading PHPStan yesterday, it was not there before. I update very often, so it was a recent change.
  • Happens on both PHP8.4 and PHP8.5alpha
  • It involves the PHPUnit method "assetNotContains", so I don't think I can create a playground example.
  • I tried creating a small repo with an example, but I can't reproduce the error there. I'm not sure why. I used the same phpstan.neon file (just paths changed) and the contents of the classes appear identical to me (except namespaces).

Given this (a bit shortened) test class:

class OmegaTag
{
    /**
     * @var Collection<array-key, OmegaProduct>
     */
    private Collection $products;

    public function __construct()
    {
        $this->products = new ArrayCollection();
    }

    /**
     * @return Collection<array-key, OmegaProduct>
     */
    public function getProducts(): Collection
    {
        return $this->products;
    }
}

This (shortened) test:

    public function testBasic(): void
    {
        $product = new OmegaProduct();
        $tag = new OmegaTag();

        self::assertNotContains($product, $tag->getProducts());
        self::assertCount(0, $tag->getProducts());
    }

This gives me this error:

Call to static method PHPUnit\Framework\Assert::assertCount() with 0 and *NEVER* will always evaluate to false.                                   
🪪  staticMethod.impossibleType

I'm not sure how PHPStan got to the type *NEVER*.

Observations:

  • When I remove the line with the method assertNotContains, the error goes away.
  • When I refactor the 2 $tag->getProducts() calls to a single variable and use that in the test, the error is still there.

It seems that assertNotContains narrows the type to never, while I think it should not do that.

Is there any direction you can point me in to find out what is wrong here?
Or is there any more info I can give if you think this is a bug?

Lenguaje dominante
PHP
Estrellas
544
Forks
58
Merge medio
2 d 1 h
PR fusionados (30 d)
5

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de phpstan/phpstan-phpunit

Todos los issues de phpstan/phpstan-phpunit

Issues similares

Más issues de PHP

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.