2013-07-13 53 views
0

我一直在编写我自己的PHP模型系统,它提供的基本ORM和DBAL支持仅仅是一个学习课程。它允许我编写以前从未做过的事情,并使用SQLite和PostgreSQL等我从未使用过的数据库。单元测试Postgresql PHP PDO失败

模型包:https://github.com/titon/Model PGSQL包:https://github.com/titon/Model.PostgreSQL

我遇到的问题是单元测试PGSQL驱动程序(我有MySQL和SQLite的工作)。任何时候单元测试运行,我收到以下错误:我知道这个问题是什么,但我似乎没有做任何修复它。它甚至没有达到我的单元测试,它在灯具设置部分失败。下面是每个单元测试期间所采取的步骤:在setUp()

  • 单位测试方法

    1. 驱动被初始化并连接被称为
    2. 赛程被加载
      1. CREATE TABLE语句被称为
      2. CREATE INDEX报表被称为
      3. INSERT记录被称为
    3. 单位测试跑
    4. tearDown()被称为其卸载夹具(DROP TABLE和INDEX)和断开

    步骤3.3中,同时插入夹具记录发生错误的驱动程序。它插入第一条记录(满分10),并且无法获取最后一个插入ID(上面的序列错误)。当我检查PGAdmin时,表格和序列确实存在,所以我很困惑。

    • 插入被调用时,序列是否尚未完全创建?
    • 我的连接会话是否过早死亡?
    • 我该如何解决这个问题?

    我对PgSQL很陌生,所以任何帮助将不胜感激。为了记录,代码使用PHP PDO并调用lastInsertId('table_column_seq')来检索最后一个ID。

    如果您有兴趣,可以参考fixture setUp SQL。

    CREATE TABLE IF NOT EXISTS "users" (
        "id" serial NOT NULL, 
        "country_id" integer NULL DEFAULT NULL, 
        "username" varchar(255) NULL, 
        "password" varchar(255) NULL, 
        "email" varchar(255) NULL, 
        "firstName" varchar(255) NULL, 
        "lastName" varchar(255) NULL, 
        "age" smallint NULL, 
        "created" timestamp NULL DEFAULT NULL, 
        "modified" timestamp NULL DEFAULT NULL, 
        UNIQUE ("username") 
    ); 
    CREATE INDEX "country_id" ON "users" ("country_id"); 
    INSERT INTO "users" ("id", "country_id", "username", "firstName", "lastName", "password", "email", "age", "created") VALUES ('1', 1, 'miles', 'Miles', 'Johnson', '1Z5895jf72yL77h', '[email protected]', 25, '1988-02-26 21:22:34'); 
    # Fails right after this insert 
    
  • +0

    如果您要使用序列(SERIAL数据类型),为什么要在INSERT语句中传递一个文字ID?为什么你将该字面值作为字符串而不是整数传递?为什么没有主键?为什么用户名是唯一的,但可以为空? –

    +0

    固定装置基本上是简单的数据,随机模式和乱七八糟的类型,其中一些在字面刺激设置中没有意义。 Fixture也在MySQL,PgSQL,SQLite和MongoDB之间共享,所以有一些怪异的东西让一切正常工作。 此外,语句输出并不完全匹配,因为PDO语句无法用其边界值查看。这些只是自动生成的。 –

    回答

    2

    不要猜测,知道。打开语句登录并查看它的作用。

    然后,您可能会看到lastInserId()调用正在从序列中获取id上的最后一个id。没有一个是因为你提供了自己的价值。停止这样做,它应该工作。

    +0

    啊这么简单的疏忽。 Fixtures用于MySQL,SQLite,PgSQL和MongoDB,所以这些ID是硬编码的。如果我需要连接关系记录,你会如何建议编写单元测试? –

    +0

    如果你没有在数据库中生成ID,为什么要抓取last-insert-id呢?我不太明白这有什么意义。如果您真的需要知道刚刚提供给数据库的值,那么您当然可以通过INSERT上的RETURNING子句返回ID。 –

    +0

    那么我插入硬编码的灯具记录,但很多单元测试插入更多的行或删除,所以它更容易硬编码的ID。但假设我删除了ID,他们都应该*按照正确的顺序插入。 –