Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 单元测试返回SQL的类_Php_Zend Framework_Phpunit_Zend Db - Fatal编程技术网

Php 单元测试返回SQL的类

Php 单元测试返回SQL的类,php,zend-framework,phpunit,zend-db,Php,Zend Framework,Phpunit,Zend Db,我试图使用PHPUnit对一些返回SQL的类方法进行单元测试。这些类应该与任何Zend_Db适配器一起工作,所以我希望测试也能这样做。我的测试看起来有点像这样: public function testEtcGeneratesCorrectSQL() { $model = new ClassBeingTested(); // do some stuff $sql = $model->__toString(); $this->assertEqual

我试图使用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);
}
--- Expected
+++ Actual
@@ @@
-SELECT foo.* FROM foo WHERE bar = 1
+SELECT `foo`.* FROM `foo` WHERE `bar` = 1
问题在于适配器之间转义的差异。如果我使用Pdo_Mysql运行此测试,我将得到如下错误:

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

    // do some stuff

    $sql = $model->__toString();

    $this->assertEquals('SELECT foo.* FROM foo WHERE bar = 1', $sql);
}
--- 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中的转义,我可以仅为这些测试的目的而打开它?我是否在适配器类型中硬编码,然后调整预期输出以匹配?或者在执行断言之前去掉不同的引号字符?

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

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

这看起来非常可怕,但如果您根据所使用的驱动程序设置DB_QUOTE,它会起作用。

如果您想测试多个驱动程序,会发生什么?您必须在一个新的PHP进程中执行此操作。如果你想接受这个想法,可以使用变量,因为它可以在测试时提供更大的灵活性…多亏了你们两位。适配器似乎有一个getQuoteIdentifierSymbol()方法,所以我可以将其放入变量并包含在断言中