2017-09-14 3 views
2

現在、手続き的に書かれたいくつかのajaxコードをテストするためにphpunit testsuiteを構築しようとしています。 元のコード、fooBar.phpを編集できません。別の場所で問題が発生する可能性があるためです。この問題は、異なるパラメータでPHPファイルを複数回実行しようとしているときに発生します。コードには再宣言例外をスローする関数があります。以下は私が扱っているものの例です。PHPUnit - 複数回組み込む必要がある手続き型コード

fooBar.php - AJAX呼び出しでヒットPHPファイル

$foo = $_POST['bar']; 

function randomFunctionName(){ 
    echo "randomFunctionName"; 
} 

if($foo == "fooBar"){ 
    $jsonResponse = array('success'=>true); 
}else{ 
    $jsonResponse = array('success'=>false); 
} 

echo json_encode($jsonResponse); 

fooBarTest.php - PHPUnitのテストファイル

class fooBarTest extends \PHPUnit\Framework\TestCase 
{ 

    private function _execute() { 
     ob_start(); 
     require 'fooBar.php'; 
     return ob_get_clean(); 
    }  

    public function testFooBarSuccess(){ 
     $_POST['bar'] = "fooBar"; 

     $response = $this->_execute(); 
     $this->assertTrue((strpos($response, 'success') !== false) && (strpos($response, 'true') !== false)); 

    }   
    public function testFooBarFailure(){ 
     $_POST['bar'] = "notFooBar"; 

     $response = $this->_execute(); 
     $this->assertTrue((strpos($response, 'success') !== false) && (strpos($response, 'false') !== false)); 

    } 

私はこのテストを実行するときに、私を得ます次のエラー

問題は、2番目のテストtestFooBarFailure()が実行されたときに、fooBar.phpが既に存在しているという事実から来ています。あなたが見ることができるように、新しい応答を得るためにfooBar.phpを再実行する必要があります。

fooBar.php fooBar.phpをPHPスタック/メモリから削除する方法はありますか?最初のテストではロードされなかったかのように再実行できますか? 2番目のテスト関数を独自のテストクラスに引き出そうとしましたが、テストスイート全体を実行すると、同じ正確なエラーが発生します。

答えて

1

私は探していたことをする方法を考え出しました。長い話ですが、私はCURLを使ってajaxファイルをヒットします。これにより、再宣言の問題を引き起こすことなく、テスト内でファイルを何度もヒットすることができます。以下はfooBarTest.phpファイルの私の解決策の例です。

class fooBarTest extends \PHPUnit\Framework\TestCase 
{ 

    public function testFooBarSuccess(){ 
     $postData = array('bar'=>"fooBar"); 

     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_POST, true); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); 

     $response = curl_exec($ch);  
     curl_close($ch); 

     $this->assertTrue((strpos($response, 'success') !== false) && (strpos($response, 'true') !== false)); 

    }   
    public function testFooBarFailure(){ 
     $postData = array('bar'=>"notFooBar"); 

     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_POST, true); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); 

     $response = curl_exec($ch);  
     curl_close($ch); 

     $this->assertTrue((strpos($response, 'success') !== false) && (strpos($response, 'false') !== false)); 

    } 
} 
0

PHPには、特定の関数が定義されていることを確認するための組み込み関数があり、function_existsと呼ばれています。例:

if (false === function_exists('randomFunctionName')) { 
    function randomFunctionName() 
    { 
     echo "randomFunctionName"; 
    } 
} 

これのおかげで、あなたinclude/requireファイルをすることができ、何度が、関数は、一度ロードされます。

fooBar.phpは、requireDifference between require, include and require_once?)の代わりにrequire_onceを一度インポートするだけです。

+0

いずれの提案もうまくいきません。関数が存在するかどうかをチェックすることは、元のfooBar.phpを変更することです。私が述べたように、私は元のコードを変更することができません。 PHPUnitテストファイルでは、新しい情報を送信するためにファイルをリロードする必要があります。一度それを要求する、またはそれを含むことは私にそれを許さない。 –

関連する問題