单元测试返回SQL的类

时间:2010-08-19 17:55:22

标签: php zend-framework phpunit zend-db

我正在尝试使用PHPUnit对一些返回SQL的类方法进行单元测试。这些类应该适用于任何Zend_Db适配器,所以我希望测试也能这样做。我的测试看起来有点像这样:

public function testEtcGeneratesCorrectSQL()
{
    $model = new ClassBeingTested();

    // do some stuff

    $sql = $model->__toString();

    $this->assertEquals('SELECT foo.* FROM foo WHERE bar = 1', $sql);
}

问题是适配器之间的转义差异。如果我使用Pdo_Mysql运行此测试,我将收到如下错误:

--- Expected
+++ Actual
@@ @@
-SELECT foo.* FROM foo WHERE bar = 1
+SELECT `foo`.* FROM `foo` WHERE `bar` = 1

如果我使用Sqlite适配器:

--- Expected
+++ Actual
@@ @@
-SELECT foo.* FROM foo WHERE bar = 1
+SELECT "foo".* FROM "foo" WHERE "bar" = 1

那么在这里做什么是正确的?有没有办法在Zend_Db中禁用转义我可以打开这些测试的目的?我是否在适配器类型中进行硬编码然后调整我的预期输出以匹配?或者在做断言之前删除不同的引号字符?

1 个答案:

答案 0 :(得分:2)

使用常量而不是硬编码任何一组引号,因此对于MySQL:

$this->assertEquals('SELECT ' . DB_QUOTE . 'foo' . DB_QUOTE . '.* FROM '
                    . DB_QUOTE . 'foo' . DB_QUOTE . ' WHERE '
                    . DB_QUOTE . 'bar' . DB_QUOTE . ' = 1');

看起来非常可怕,但是如果你根据你正在使用的驱动程序设置DB_QUOTE它将会起作用。