我有一個控制器我想創建功能測試。該控制器通過MyApiClient
類向外部API發送HTTP請求。我需要嘲笑這個MyApiClient
類,所以我可以測試我的控制器如何響應給定的響應(例如,如果MyApiClient
類返回500響應,它會執行什麼操作)。Symfony 2與模擬服務功能測試
我沒有任何問題通過標準的PHPUnit mockbuilder創建MyApiClient
類的模擬版本:我遇到的問題是讓我的控制器使用這個對象來處理多個請求。
我目前做在我的測試如下:
class ApplicationControllerTest extends WebTestCase
{
public function testSomething()
{
$client = static::createClient();
$apiClient = $this->getMockMyApiClient();
$client->getContainer()->set('myapiclient', $apiClient);
$client->request('GET', '/my/url/here');
// Some assertions: Mocked API client returns 500 as expected.
$client->request('GET', '/my/url/here');
// Some assertions: Mocked API client is not used: Actual MyApiClient instance is being used instead.
}
protected function getMockMyApiClient()
{
$client = $this->getMockBuilder('Namespace\Of\MyApiClient')
->setMethods(array('doSomething'))
->getMock();
$client->expects($this->any())
->method('doSomething')
->will($this->returnValue(500));
return $apiClient;
}
}
它好像當第二請求時,引起MyApiClient
再次被實例化的容器正在重建。 MyApiClient
類被配置爲通過註釋(使用JMS DI Extra Bundle)的服務,並通過註釋注入到控制器的屬性中。
我會將每個請求分成它自己的測試,以解決此問題,如果可以的話,但不幸的是我不能:我需要通過GET操作向控制器發出請求,然後POST它的形式帶回來。我想這樣做的原因有兩個:
1)表單使用CSRF保護,所以如果我直接將表單直接POST到表單而不使用爬行器提交表單,表單將失敗CSRF檢查。
2)測試表單在提交時生成正確的POST請求是一種獎勵。
有沒有人有任何建議如何做到這一點?
編輯:
這可以在不依賴於任何我的代碼如下單元測試來表示,因此可能會更清楚:
public function testAMockServiceCanBeAccessedByMultipleRequests()
{
$client = static::createClient();
// Set the container to contain an instance of stdClass at key 'testing123'.
$keyName = 'testing123';
$client->getContainer()->set($keyName, new \stdClass());
// Check our object is still set on the container.
$this->assertEquals('stdClass', get_class($client->getContainer()->get($keyName))); // Passes.
$client->request('GET', '/any/url/');
$this->assertEquals('stdClass', get_class($client->getContainer()->get($keyName))); // Passes.
$client->request('GET', '/any/url/');
$this->assertEquals('stdClass', get_class($client->getContainer()->get($keyName))); // Fails.
}
此測試失敗,即使我立即第二次調用request()
謝謝你。我沒有試過這個庫 - 我最終只用了一個由Symfony的DI確定的單個模擬類,這並不理想 - 但我肯定會考慮將來使用它。這似乎是最適合我原來的問題,所以我接受了這個答案。 – ChrisC 2014-06-11 18:40:37