0

私はZendにかなり慣れておらず、単体テストの作成にいくつかの問題があります。私はそれを最小限のテストクラスに分解しましたが、それでも問題を再現します。

class UserRegistrationsTest extends PHPUnit_Framework_TestCase 
{ 

保護された$db;

public function __construct($ name = NULL){parent :: __construct($ name);

$ this-> db = Zend_Db :: factory('Pdo_Mysql'、array('host' => '127.0.0.1'、'username' =>'root'、'password' =>'xxxxxxxx'、'dbname' = >'testingdb'));

Zend_Db_Table_Abstract :: setDefaultAdapter($ this-> db); }

public function testName(){$ users = new Users(); $ select = $ users-> select()-> where('regCode =?'、'deadbeef'); $ row = $ users-> fetchRow($ select); }

}

つまり、これは簡略化されたテストです。内部にデータを含むデータベースを設定しています(正しく接続されています)。regCodeが'deadbeef'に設定されたレコードがあり、email、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 $_name = 'users';

}

私の問題は、データベースにうまく挿入できることですが、クエリは奇妙な結果を返します。上記のfetchRowは正しいSQLを生成しますが、返される行はガベージです。regCode、email、regDate列をまったく含まない行が返され、アフィリエイトは存在しますが、列は「アフィリエイト」ではなく「users」と呼ばれます。

私は他のテーブルでそれを試しましたが、何も機能しません-データベース名を列ヘッダーとして返し、テーブル名を列として返すものさえあります。

注意すべきことの1つは、これをテストで実行していない場合は正常に機能することです。適切なアプリのまったく同じコードとdbはうまく機能しますが、phpUnitテストとして実行すると、すべてが厄介になります:-(

アドバイスをいただければ幸いです

乾杯、ブリン

4

2 に答える 2

0

これは古い Zend のバグで、現在は修正されています

于 2010-05-07T15:41:16.530 に答える
0

他のテーブル、または regCode フィールドを持つテーブルを持つ別のデータベースがありますか? 間違ったアダプターを使用している可能性があります。これにより、クエリがまだ実行される理由が説明されます。テスト環境の前提条件は、少なくとも本番環境とまったく同じ構造 (テーブル + フィールド) を持つことです。それらが異なる場合、一部のクエリは正常に実行され、一部のクエリは実行されない可能性があります。

于 2009-10-29T14:20:38.460 に答える