2017-06-13 140 views
0

我是一名探索PHP和PHPUnit的rails程序員。從RSpec切換到PHPUnit,我一直在努力。`expect_any_instance_of`等價於PHPUnit

更具體地說,RSpec有一個非常好的存根方法,稱爲expect_any_instance_of,允許您存根任何類的任何實例。

我很努力地在PHPUnit中找到等價物。

這是我在代碼中的場景:

<?php 
use PHPUnit\Framework\TestCase; 

class SomeClass 
{ 
    public function testMethod() 
    { 
     $api_interface = new RemoteAPIClassObject(); 
     $result = $api_interface->makeCall() 
     $this->assertEquals('foo', $result->api_response); 
    } 
} 
?> 

我想存根方法makeCall這是RemoteAPIClassObject實例的一部分。有沒有什麼辦法可以在PHPUnit中做到這一點,所以我每次運行測試套件時都不需要對遠程服務器進行遠程API調用?

我已閱讀了PHPUnit test doubles and class mocks但是好像所有的PHPUnit存根/模擬方法都返回一個存根實例,這不是我想要的,因爲我試圖存根的方法更接近調用堆棧。

在rspec的我只想用我前面提到的方法存根電話:

expect_any_instance_of(RemoteAPIClassObject).to receive(:makeCall).and_return(some_stubbed_object)

也許我的策略是關閉的,我需要重新考慮我的測試?

+0

嗨!歡迎來到PHP世界。我過去使用過「Mockery」(PHPUnit模擬不如表達)。爲了模擬http調用,'php-vcr'是一個不錯的項目。 – fedeisas

回答

1

你會創建一個類的模擬對象,並使用它。

$api_interface = $this->getMockBuilder('RemoteAPIClassObject') 
    ->setMethods(['makeCall']) 
    ->getMock(); 

$api_interface->expects($this->once()) 
    ->method('makeCall') 
    ->willReturn((object)['api_response' => 'foo']); 

然而,這樣做是不是一個好的做法。我們正在嘲笑我們正在測試的課程。允許您正在測試的課程獲得模擬連接,我們可以將其傳遞到RemoteAPIClassObject並將其連接到一個響應中。這將允許您的代碼不必實際進行遠程API調用,並允許您可以進行連接的靈活性。

我無法提供更多詳細信息,而無法查看有關正在測試的對象的更多信息。

+0

+1對於'允許您正在測試的課程接受模擬連接會更好' –