2012-08-02 91 views
1

我正在寫一個使用框架遵循MVC模式 - Kohna 3.2的Facebook應用程序。我想測試我的服務器端代碼。我決定編寫模型的單元測試和功能測試來檢查控制器/視圖。決定使用PHPUnit。功能測試和外部api

所以我很快遇到了一個問題。如何在請求處理期間爲使用外部API的控制器編寫函數測試?

我不想使用真正的API調用。它們的執行需要很長時間,並且需要在會話中使用身份驗證令牌,並很快失效。另外測試像'在牆上寫帖子'這樣的東西會產生大量的垃圾郵件。

我真的看不出如何嘲笑這一點。當然,我可以爲外部api包裝庫創建一個模擬對象,但我認爲應該通過創建請求並檢查其響應來進行功能測試。所以我沒有看到一個地方,我可以注入模擬對象..

你會怎麼做呢?

+0

所以你想實現假的API來測試你的代碼?我對嗎? – 2012-08-31 11:37:42

+0

這是正確的。 – Luigi 2012-08-31 14:02:15

回答

0

在回顧我自己的懸而未決的問題,我可以回覆自己,使用DIC(依賴注入容器)就是答案。它讓具有不同配置的測試enviornment,或測試期間使用單一的PHP程序時,只是進行測試之前設置嘲笑它甚至有可能。

2

1)當測試的東西,它與API包裝器一起工作時,應該模擬整個API包裝類,並模擬拋出異常作爲錯誤狀態和測試,應用程序本身將如何對這些異常做出反應。

它應該停止做一些依賴於API響應的操作,它應該可能會顯示一些用戶友好的錯誤。更有甚者,您可以(也可能應該)測試API包裝器上的哪些方法被調用了+多少次以及傳遞了哪些參數。

<?php 

public function testShowUser() { 
    $fb = $this->getMock('Facebook\Api'); 
    $fb->expects($this->once()) // if your library will call getUserInfo() more than once or never, the test will fail 
     ->method('getUserInfo') 
     ->with($this->equalTo('johndoe')) // if the method will be called with different parameter, the test will fail 
     ->will($this->throwException('Facebook\NonExistingUser')); 

    $myApp = new MyApp($fb); 
    $myApp->renderUser('johndoe'); // if this will throw uncaught exception, the test will fail 

    $this->assertEquals(
     array('The user you requested does not exist'), 
     $myApp->getFlashMessages() 
    ); 
} 

2)當測試的API包裝本身你可以模擬從API原始響應。

您應該圍繞HTTP通信整體的東西分開,一些特定的類(捲曲包裝/有自己的單元測試/),並假設服務器返回的一些特定的HTTP代碼和響應。

您可以將所有可能的響應類型保存在文件中,以便您可以將它們加載到測試中作爲響應。

我建議做這種方式:

<?php 

/** 
* @expectedException Facebook\NonExistingUser 
*/ 
public function testUnavailableApi() { 
    $curl = $this->getMock('CurlWrapper'); 
    $curl->expects($this->once()) 
     ->method('getBody') 
     ->will($this->returnValue(file_get_contents('fb_404_response.json'))); 
    $curl->expects($this->once()) 
     ->method('getStatusCode') 
     ->will($this->returnValue(404)); 

    $api = new Facebook\Api($curl); 
    $api->getUserInfo('johndoe'); 
} 
+0

我知道如何嘲笑事物。我只是想知道,當我創建請求並測試結果時,我怎麼能注入這些嘲笑。可以發佈此問題的最佳答案,我走到這一步,是使用依賴注入容器,並將其配置爲使用模擬的測試,鍛造請求之前的時間。 – Luigi 2012-09-11 14:00:26