我正在尝试使用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中禁用转义我可以打开这些测试的目的?我是否在适配器类型中进行硬编码然后调整我的预期输出以匹配?或者在做断言之前删除不同的引号字符?
答案 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它将会起作用。