テストの実行中にZend_Db_Table_Abstract fetchrowがガベージデータを返すのを停止するにはどうすればよいですか?
-
10-07-2019 - |
質問
私はZendを初めて使用するので、ユニットテストの作成に苦労しています。私はそれを私がやっていることだと思って、問題を再現する最小限のテストクラスにそれを取り除きました:
class UserRegistrationsTest extends PHPUnit_Framework_TestCase
{
保護された$ db;
パブリック関数__construct($ name = NULL) { parent :: __ construct($ name);
$ this-> db = Zend_Db :: factory( 'Pdo_Mysql'、array( 'host' => 「127.0.0.1」、 'username' => 'ルート'、 'password' => 「xxxxxxxx」、 'dbname' => 「testingdb」 ));
Zend_Db_Table_Abstract :: setDefaultAdapter($ this-> db); }
パブリック関数testName() { $ users = new Users(); $ select = $ users-> select()-> where( 'regCode =?'、 'deadbeef'); $ row = $ users-> fetchRow($ select); }
}
これは簡略化されたテストです。内部にデータがあるDBがセットアップされています(正しく接続されています)。 regCodeが「deadbeef」に設定されたレコードがあり、電子メール、regDate、およびアフィリエイトのフィールドもあります。
CREATE TABLE testingdb.users (
regCode varchar(16) NOT NULL,
email varchar(150) NOT NULL,
regDate datetime NOT NULL,
affiliate int(10) unsigned DEFAULT NULL,
PRIMARY KEY (regCode))
Users.phpという名前のクラスがありますが、これは簡単です:
class Users extends Zend_Db_Table_Abstract {
protected 私はZendを初めて使用するので、ユニットテストの作成に苦労しています。私はそれを私がやっていることだと思って、問題を再現する最小限のテストクラスにそれを取り除きました:
class UserRegistrationsTest extends PHPUnit_Framework_TestCase
{
保護された$ db;
パブリック関数__construct($ name = NULL)
{
parent :: __ construct($ name);
$ this-> db = Zend_Db :: factory( 'Pdo_Mysql'、array(
'host' => 「127.0.0.1」、
'username' => 'ルート'、
'password' => 「xxxxxxxx」、
'dbname' => 「testingdb」
));
Zend_Db_Table_Abstract :: setDefaultAdapter($ this-> db);
}
パブリック関数testName()
{
$ users = new Users();
$ select = $ users-> select()-> where( 'regCode =?'、 'deadbeef');
$ row = $ users-> fetchRow($ select);
}
}
これは簡略化されたテストです。内部にデータがあるDBがセットアップされています(正しく接続されています)。 regCodeが「deadbeef」に設定されたレコードがあり、電子メール、regDate、およびアフィリエイトのフィールドもあります。
CREATE TABLE testingdb.users (
regCode varchar(16) NOT NULL,
email varchar(150) NOT NULL,
regDate datetime NOT NULL,
affiliate int(10) unsigned DEFAULT NULL,
PRIMARY KEY (regCode))
Users.phpという名前のクラスがありますが、これは簡単です:
<*>
私の問題は、データベースに正常に挿入できることですが、どのクエリも奇妙な結果を返します。上記のfetchRowは正しいSQLを生成しますが、返される行はガベージです-regCode、email、regDate列をまったく含まない行を返し、アフィリエイトは存在しますが、collumnは「affiliate」ではなく「users」と呼ばれます。
他のテーブルで試してみましたが、何も動作しません-データベース名を列ヘッダーとして、テーブル名を列として返すものさえあります。
注意すべきことの1つは、これをテストで実行していない場合は正常に動作することです。適切なアプリでまったく同じコードとdbがうまく機能しますが、phpUnitテストとして実行すると、すべてが厄介になります:-(
ご意見をお寄せください
乾杯、
ブリン
name = 'users';
}
私の問題は、データベースに正常に挿入できることですが、どのクエリも奇妙な結果を返します。上記のfetchRowは正しいSQLを生成しますが、返される行はガベージです-regCode、email、regDate列をまったく含まない行を返し、アフィリエイトは存在しますが、collumnは「affiliate」ではなく「users」と呼ばれます。
他のテーブルで試してみましたが、何も動作しません-データベース名を列ヘッダーとして、テーブル名を列として返すものさえあります。
注意すべきことの1つは、これをテストで実行していない場合は正常に動作することです。適切なアプリでまったく同じコードとdbがうまく機能しますが、phpUnitテストとして実行すると、すべてが厄介になります:-(
ご意見をお寄せください
乾杯、 ブリン
解決 2
これは、現在修正されている古いZendのバグでした
他のヒント
他のテーブル、またはregCodeフィールドを持つテーブルを持つ別のデータベースがありますか?間違ったアダプターを使用している可能性があります。これは、クエリがまだ実行される理由を説明します。テスト環境の前提条件は、少なくとも本番環境とまったく同じ構造(テーブル+フィールド)であることです。それらが異なる場合、一部のクエリは正常に実行される場合がありますが、そうでない場合もあります。