Problèmes liés à l'utilisation de la moquerie partielle dans Laravel 9.x
P粉726234648
P粉726234648 2023-09-02 23:28:57
0
1
537
<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粉726234648
P粉726234648

répondre à tous(1)
P粉885035114

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.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal