【发布时间】:2017-11-20 12:33:57
【问题描述】:
使用ci-php-unit-test 库对 PHP/codeigniter 进行单元测试,并对控制器方法进行单元测试。
无法弄清楚如何模拟使用 composer 安装的外部库。
我的 SUT 方法是:
function twitter()
{
$this->load->model('misc/twitter_model');
$request_token = [];
$request_token['oauth_token'] = $_SESSION['twitter_oauth_token'];
$request_token['oauth_token_secret'] = $_SESSION['twitter_oauth_token_secret'];
if ( (isset($_GET['oauth_token'])
&& ($request_token['oauth_token'] !== $_GET['oauth_token'])))
{
log_message('info','abort something is wrong!');
}
else
{
$connection = new Abraham\TwitterOAuth\TwitterOAuth(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET, $request_token['oauth_token'], $request_token['oauth_token_secret']);
$access_token = $connection->oauth("oauth/access_token", array("oauth_verifier" => $_REQUEST['oauth_verifier']));
$this->session->set_userdata('twitter_access_token',$access_token);
redirect(get_session('twitter_callback1'));
}
}
我的测试方法(到目前为止)是:
public function test_twitter()
{
$_SESSION['twitter_oauth_token'] = 'twitter_oauth_token';
$_SESSION['twitter_oauth_token_secret'] = 'twitter_oauth_token_secret';
$this->request->setCallable(
function (& $CI) {
// Get mock object
$twitter_oa = $this->getMockBuilder('TwitterOAuth')
->disableOriginalConstructor()
->setMethods(['oauth'])
->getMock();
$twitter_oa->method('oauth')
->willReturn('access_token');
}
);
$output = $this->request('GET','callbacks/twitter',['oauth_token'=>'twitter_oauth_token']);
var_export($output);
}
但是原始库正在执行,因为它没有被模拟 - $twitter_oa 没有附加到 CI 实例。
这是因为在codeigniter控制器实例化后外部库还没有被实例化。 (这是 setCallable 方法所做的)
我的问题是,如何在实例化 codeigniter 控制器后模拟 TwitterOAuth,以便它可以返回设置的测试文本? (显然没有实例化 twitter Oauth 库)
【问题讨论】:
标签: php codeigniter unit-testing phpunit