2012-03-12 19 views
3

私のコードでは、MySQLiクラスを初期化するファイルがあります。関数内のグローバル変数の値がNULLです

File a

$db = new Database(); //MySQLi class 

とにかく、このデータベース・クラスを含むファイルがあります。このファイルには、関数が宣言されている他のファイルも含まれています。私は$db

File bに連絡するglobalを使用しています:

function xy(){ 
    global $db; 
    $sql = "..." 
    return $db->getArray($sql); 
} 

Testfile

require "file_a.php"; 
require "file_b.php"; 
require_once "PHPUnit/Framework/TestCase.php"; 

class testProblemStatistics extends PHPUnit_Framework_TestCase { 

    testArray(){ 
     $this->assertTrue(array_key_exists('xy', $this->xy()) 
    } 
} 

私が手:
致命的なエラー:メンバ関数のgetArray(の呼び出し)に非対象物

は私が調べた:

var_dump($db); 
function xy(){ 
    global $db; 
    var_dump($db); 
    ... 
} 

最初のダンプがMySQLiを第二ダンプが

何かがfile_bでグローバル変数と間違っている私にNULLを与えた
オブジェクトくれました。

追加情報:私はPHPUnitを使用しており、コマンドプロンプトで実行しています。通常のブラウザでは、すべて正常に動作します。あなたが完全にPHPUnitのマニュアルon Global Stateを理解しなければならない

+0

とするときは、あなたのテストで$デシベルグローバル設定? – jpic

+0

$ dbはテスト自体の内部ではなく、テスト対象のファイルの内部にあります。 – Josef

+0

**および**初期化はいつですか? :)とにかく、あなたは私の答えを試しましたか? – jpic

答えて

9

解決策は、データベースクラスを$GLOBALSアレイにハードコードすることです。PHPUnitのブートストラップとしてこれを追加する

$GLOBALS['db'] = $db; 

は私のためにうまく働きました。これは一種のハックであり、テストケースで使用する必要があります。

4

By default, PHPUnit runs your tests in a way where changes to global and super-global variables ($GLOBALS, $_ENV, $_POST, $_GET, $_COOKIE, $_SERVER, $_FILES, $_REQUEST) do not affect other tests. Optionally, this isolation can be extended to static attributes of classes.

可能性が非常に高い、$デシベルグローバル変数がテスト中に作成されます。したがって、テスト後にはnullに戻されます。 setUp()でグローバル変数を設定するか、PHPUnitをこのグローバルで動作させる方法を自分で管理するか、それを行うにはいくつかの方法があります。

スイッチ@backupGlobalsの値と、それはバックアップをしない/テストの間でリストア操作:@backupGlobals enabledはテストが@backupGlobals disabledは、それが合格作るwheras失敗させる理由

<?php 

function xy() { 
    global $foo; 
    var_dump($foo); 
    return $foo; 
} 

/** 
* @backupGlobals disabled 
*/ 
class someTestCase extends PHPUnit_Framework_TestCase { 

    public function testA() { 
     global $foo; 
     $foo = 'bar'; 
    } 

    public function testB() { 
     global $foo; 
     $this->assertEquals($foo, 'bar'); 
    } 
} 

あなたは理解していますか?

バックアップをしたい場合は/ $ DB以外のグローバル変数の復元は、そのようなクラス属性を定義します。

protected $backupGlobalsBlacklist = array('db'); 

これは、あまりにも動作します。実際には、テストアイソレーションを持つのがうれしいので、さらに良いでしょう。

3

PHPUnitで実行すると、ファイルaの最上位コードが何らかの方法で実行され、$ dbへの代入はローカル変数を参照しているようです。

global $db; 
$db = new Database(); //MySQLi class 
0

zerkmsによるこの答えは私を助け:https://stackoverflow.com/a/4074833/2016870は:それはテストの実行中にそのように留まるように、それが明示的にグローバル作る

I bet you're executing this code by including this file inside another function.

So you need to mark as global first variable occurency too.

Btw, global variables is weird, the more simple and correct way to pass the data to the function - is to use funtction parameters.

関連する問題