Heim  >  Fragen und Antworten  >  Hauptteil

Probleme bei der teilweisen Verspottung in Laravel 9.x

<p>Hey Laravel-Entwickler, ich habe ein Problem mit teilweisem Mocking gefunden. Ich muss eine Methode testen, die eine interne Methode verwendet, die verspottet werden muss. Ich habe versucht, mehrere Methoden zu verwenden, um die Methode zu verspotten, wie die nächste Idee: < /p> <pre class="brush:php;toolbar:false;">#1 $mockMyClass = Mockery::mock( $myClassInstance )->makePartial(); #2 $mockMyClass = $this->partialMock(); #3 $mockMyClass = $this->createPartialMock(); // und dann $mockMyClass->shouldReceive('internalMethod') ->andReturn($responseInternalMethod);</pre> <p>Und natürlich auf die in der Dokumentation Laravel Mocking Objects</p> <pre class="brush:php;toolbar:false;">AppService verwenden; verwenden Sie MockeryMockInterface; $mock = $this->partialMock(Service::class, function (MockInterface $mock) { $mock->shouldReceive('process')->once(); });</pre> <p>Keine dieser Ideen funktioniert. $mockMyClass führt immer die echte Methode aus, nicht die Scheinmethode, die $responseInternalMethod zurückgeben sollte. Hat jemand dieses Problem auch? Ich muss bestätigen, ob es sich um ein Problem mit Laravel, Mockito oder extern handelt und nicht um die lokale Umgebung, haha. Ich lese dich! </p> <p>Technische Details: Laravel 9.x PHP 8.1 PHP-Einheit 9.5 Verspottung 1,5</p>
P粉726234648P粉726234648435 Tage vor520

Antworte allen(1)Ich werde antworten

  • P粉885035114

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

    好吧,我找到了解决方案,但无论如何,我有兴趣知道是否有人也遇到这个问题

    我解决这个问题的方法是:

    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);
    }
    这些情况的解决方案是直接创建我的类的模拟实例,并将构造函数所需的所有参数作为依赖项或数据。然后使用模拟类作为真实类继续测试循环。

    Antwort
    0
  • StornierenAntwort