2017-06-18 50 views
0

ci-php-unit-testライブラリを使用して、PHP/codeigniterのユニットテストやユニットテストのコントローラメソッドを実行します。PHP/Codeigniterで外部ライブラリをモックする

コンポーザを使用してインストールされた外部ライブラリの模擬方法を試すのに問題があります。

私のSUTの方法は次のとおりです。

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 ISN:

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')); 
    } 
} 

私のテスト方法は(今のところ)でありますCIインスタンスにアタッチされていません。

これは、コード・ライター・コントローラーのインスタンス化後に外部ライブラリーがインスタンス化されていないためです。 (これはsetCallableメソッドであった)

私の質問は、codeigniterコントローラがインスタンス化された後にTwitterOAuthを模擬して、設定されたテストテキストを返すことができますか? (もちろん、TwitterのOauthライブラリをインスタンス化しないでください)

答えて

0

OK、新しいClass()が表示されたら、ユニットテストでは、何かを再処理する必要があります。これは最良の選択肢ではないかもしれませんが、これは私にとってはうまくいきます。 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 = $this->twitter_connection($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')); 
    } 
} 

/** 
* @param $token 
* @param $secret 
* @return \Abraham\TwitterOAuth\TwitterOAuth 
* 
* @codeCoverageIgnore 
* 
*/ 
public function twitter_connection($token, $secret) 
{ 
    return new Abraham\TwitterOAuth\TwitterOAuth(
     TWITTER_CONSUMER_KEY, 
     TWITTER_CONSUMER_SECRET, 
     $token, 
     $secret); 
} 

ありとAPPPATH.tests /モック/ external_libariesに新しいファイルです:

class MockTwitterOAuth 
{ 
    public function oauth() 
    { 
     return 'access_token'; 
    } 
} 

は、テストコードは以下のようになります。

public function test_twitter() 
{ 
    $_SESSION['twitter_oauth_token'] = 'twitter_oauth_token'; 
    $_SESSION['twitter_oauth_token_secret'] = 'twitter_oauth_token_secret'; 
    $_SESSION['twitter_callback1'] = 'cb1'; 
    require_once(APPPATH.'tests/mocks/external_libraries/MockTwitterOauth.php'); 
    $twitter_connection = new MockTwitterOAuth(); 
    MonkeyPatch::patchMethod('Callbacks',[ 
     'twitter_connection'=>$twitter_connection 
    ]); 
    $output = $this->request('GET','callbacks/twitter',['oauth_token'=>'twitter_oauth_token']); 
    $this->assertNull($output); 
    $this->assertResponseCode(HTTP_FOUND); 
    $this->assertRedirect(base_url('cb1')); 
    $this->assertEquals('access_token',$_SESSION['twitter_access_token']); 
} 

トリックは、通常、新しいTwitterOAuthクラスを返すことですが、システムが単体テストの場合、代わりに1つのメソッドしかないMockTwitterOAuthクラスを返します。これは、コントローラコードをMonkeypatchingすることで実現できます。

この回答が他の人には便利だと思いますが、まだ使用していないと、https://github.com/kenjis/ci-phpunit-testは始めるのが難しいですが、かなり良いです。コンパニオンブックを購入することをお勧めします!

関連する問題