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-связью, с каким-то конкретным классом (оболочка Curl / со своими собственными модульными тестами /) и предположить, что сервер вернул какой-то конкретный код 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' );
}
person
Radek Simko
schedule
05.09.2012