3

SELECT クエリを作成し、見つかった行を返すメソッドをテストしようとしています。データセットが与えられた場合、このメソッドが他のものを返さないことを確認したいと思います。データセットの作成に関するドキュメントはたくさん見つかりましたが、私の場合はそれを使用することについては何も見つかりませんでした...助けてくれてありがとう。

テストする方法は次のとおりです。

class A
{
  public static function myMethod()
  {
    $result = mysql_query("SELECT * FROM user");
    [...]
    return $rows;
  }
}

テストクラスは次のとおりです。

class ATest extends PHPUnit_Extensions_Database_TestCase
{
  protected $pdo;

  public function __construct()
  {
    $this->pdo = new PDO('mysql:host=localhost;dbname=db_name',
                         'login', 'password');
  }

  public function getConnection()
  {
    return $this->createDefaultDBConnection($this->pdo, 'db_name');
  }

  public function getDataSet()
  {
    return $this->createFlatXMLDataSet('mydataset.xml');
  }

  public function testMyMethod()
  {
    $actual = A::myMethod();
    $this->assertEquals(array([...]), $actual);
    // For this test, I get a mySQL error "No database selected"
    // in A::myMethod()!
  }
}

mydataset.xml の内容は次のとおりです。

<?xml version="1.0" ?>
<dataset>
  <user iduser="1" name="John" />
  <user iduser="2" name="James" />
</dataset>
4

2 に答える 2

2

私の場合は、次のようにpdoを使用してデータベースに接続しました。

static private $pdo=null;
private $conn=null;
    public function getConnection()
        {
            if($this->conn===null)
            {
                if(self::$pdo===null)
                {
                    self::$pdo = new PDO("mysql:host=yourhost;dbname=yourdbname_",
                "yourusername", "yourpassword");
                }
                $this->conn= $this->createDefaultDBConnection(self::$pdo, 'yourdbname_');
                return $this->conn;
            }
        }, 

次に、テストに関しては、以下のこのブロックはtestdbのすべての値を取得し、それをxmlファイルと比較します。

 public function testGetAll()
            {
                $resultingTable = $this->db
                ->createQueryTable("yourtable",
                "SELECT * FROM yourtable");
                 $expectedTable = $this->getDataSet()
                ->getTable("yourtable");
            $this->assertTablesEqual($expectedTable,
                $resultingTable);   
            }

これは私にとっては問題なく機能し、testdbからすべての値を取得し、それらがxml値と同じであることを表明できるはずです。

于 2013-03-14T03:27:32.937 に答える
1

実際のアプリケーションと同様に、データベースを呼び出す前にデータベースに接続する必要があります。このmysql_query()関数は、 に対して行われた以前の呼び出しに依存していますmysql_connect()。1 つのクラス メソッドのみを単独で呼び出している場合は、connect 関数を呼び出していないため、接続が確立されていないため、クエリ コマンドは、クエリする必要があるデータベースを認識できません。

テストクラスで使用されている PDO 接続は、テストされているメソッドから明示的に分離されており、テストされているメソッドによって使用されていません (これは、これらのメソッドが PDO を使用している場合でも適用されます)。クエリの接続を作成する必要があります。

ここでの解決策は、テストの開始時に DB 接続メソッドへの呼び出しを含めることです。これは、単体テスト メソッド、setUp()テスト クラスのメソッド、またはテストを実行する前に PHPUnit が呼び出すブートストラップ ファイルにある可能性があります。どちらを使用するかは、実行する必要がある DB テストの数と、テスト クラスの数によって異なります。

トピックから少し外れていますが、それでも関連性があります: あなたのコードは古いmysql_xxx()関数 (つまりmysql_query()) を使用していることに注意してください。これらの関数は廃止され、安全ではなく、PHP 開発チームによって非推奨にされているため、使用を避けることをお勧めします。したがって、PHP を使用し続けると、今後 PHP のバージョンをアップグレードできなくなります。

代わりに使用してくださいmysqli_xxx()(または、テスト クラスに従って PDO を使用してください)。

トピックに戻ると、実際にこれを行うと、とにかく発生している問題を修正することにもつながります。これは、mysqliと PDO の両方で、関数/メソッドを呼び出すときに接続オブジェクトを使用できるようにする必要があるため、有効な接続オブジェクトを使用して、クエリを呼び出すための有効な構文を使用することもできます。したがって、mysqli または PDO に切り替えると、質問の問題を解決する方法でコードを作成する必要があります。

于 2012-12-10T13:01:12.977 に答える