首頁  >  問答  >  主體

在 Laravel 9.x 中使用部分模擬時出現問題

<p>嘿,laravel 開發人員,我發現了部分模擬的問題,我需要測試一個使用內部方法的方法,這需要被模擬,我嘗試使用幾種方法來模擬該方法,例如下一個想法:< ;/p> <pre class="brush:php;toolbar:false;">#1 $mockMyClass = Mockery::mock( $myClassInstance )->makePartial(); #2 $mockMyClass = $this->partialMock(); #3 $mockMyClass = $this->createPartialMock(); // and then $mockMyClass->shouldReceive('internalMethod') ->andReturn($responseInternalMethod);</pre> <p>並且顯然使用文檔 Laravel Mocking Objects 中描述的方式</p> <pre class="brush:php;toolbar:false;">use App\Service; use Mockery\MockInterface; $mock = $this->partialMock(Service::class, function (MockInterface $mock) { $mock->shouldReceive('process')->once(); });</pre> <p>這些想法都行不通,$mockMyClass 總是執行真正的方法,而不是應該返回 $responseInternalMethod 的模擬方法。有人也有這個問題嗎?我需要確認是否是 Laravel、Mockito 或外部的問題,而不是本地環境問題,哈哈。我讀懂你們了! </p> <p>技術細節: Laravel 9.x PHP 8.1 PHP 單元 9.5 嘲諷1.5</p>
P粉726234648P粉726234648435 天前522

全部回覆(1)我來回復

  • 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);
    }
    這些情況的解決方案是直接建立我的類別的模擬實例,並將建構函數所需的所有參數作為依賴項或資料。然後使用模擬類別作為真實類別繼續測試循環。

    回覆
    0
  • 取消回覆