Maison  >  Questions et réponses  >  le corps du texte

Problèmes liés à l'utilisation de la moquerie partielle dans Laravel 9.x

<p>Hé développeurs de Laravel, j'ai trouvé un problème avec la moquerie partielle, je dois tester une méthode qui utilise une méthode interne, qui doit être moquée, j'ai essayé d'utiliser plusieurs méthodes pour se moquer de la méthode, comme l'idée suivante : < ; /p> <pre class="brush:php;toolbar:false;">#1 $mockMyClass = Moquerie :: maquette ( $myClassInstance )->makePartial(); #2 $mockMyClass = $this->partialMock(); #3 $mockMyClass = $this->createPartialMock(); // et puis $mockMyClass->shouldReceive('internalMethod') ->andReturn($responseInternalMethod);</pre> <p>Et évidemment en utilisant la manière décrite dans la documentation Laravel Mocking Objects</p> <pre class="brush:php;toolbar:false;">utiliser AppService ; utilisez MockeryMockInterface ; $mock = $this->partialMock(Service::class, function (MockInterface $mock) { $mock->shouldReceive('process')->once(); });</pré> <p>Aucune de ces idées ne fonctionne, $mockMyClass exécute toujours la méthode réelle, pas la méthode fictive qui devrait renvoyer $responseInternalMethod. Quelqu'un a-t-il également ce problème ? Je dois confirmer si c'est un problème avec Laravel, Mockito ou en externe, et non avec l'environnement local, haha. Je t'ai lu ! </p> <p>Détails techniques : Laravel 9.x PHP8.1 Unité PHP 9.5 Provocation 1.5</p>
P粉726234648P粉726234648435 Il y a quelques jours519

répondre à tous(1)je répondrai

  • P粉885035114

    P粉8850351142023-09-03 17:16:49

    D'accord, j'ai trouvé la solution, mais quoi qu'il en soit, je suis curieux de savoir si quelqu'un a aussi ce problème

    Ma solution à ce problème est :

    public function testRealExternalMethod()
    {
        // Create a mock of the dependency that will be used by the class
        $mockDependency = $this->createMock(Dependency::class);
        
        // in this case we need to use a partial mock because we have an internal method
        $mockMyClass = Mockery::mock(
            MyClass::class,
            [$mockDependency, $parameter1]
        )
            ->makePartial();
    
        $responseInternalMethod = ['needed data'];
    
        $mockMyClass->shouldReceive('internalMethod')
            ->andReturn($responseInternalMethod);
    
        $result = $mockMyClass->realExternalMethod($parameter2, $parameter3);
    }
    La solution dans ces cas est de créer directement une instance fictive de ma classe et de transmettre tous les paramètres requis par le constructeur en tant que dépendances ou données. Continuez ensuite la boucle de test en utilisant la classe fictive comme classe réelle.

    répondre
    0
  • Annulerrépondre