Bug(バグ) #3336
Yuya Watanabe さんが11年以上前に更新
h3. 概要 opDoctrineQueryTest が APC のない環境で失敗する. h3. 概要 例えば下記のように lastQueryCacheHash を取得してきているが,両方とも空文字列を返すため値が等しくなり,テストが失敗する. <pre> test/unit/util/opDoctrineQueryTest.php 31 Doctrine::getTable('AdminUser')->find(1); 32 $keys['find'] = myQuery::$lastQueryCacheHash; ... 55 $t->isnt($keys['find'], $keys['find_all'], '->find() and ->findAll() generates different query cache keys'); </pre> $lastQueryCacheHash は calculateQueryCacheHash() を呼び出す. <pre> test/unit/util/opDoctrineQueryTest.php 5 class myQuery extends opDoctrineQuery 6 { 7 public static $lastQueryCacheHash = ''; 8 9 public function calculateQueryCacheHash() 10 { 11 self::$lastQueryCacheHash = parent::calculateQueryCacheHash(); 12 13 return self::$lastQueryCacheHash; 14 } 15 } </pre> calculateQueryCacheHash() が呼ばれるのは find() や findAll() など, おおまかに言うと execute() を呼び出している部分.932 行目の $this->conn->getAttribute(Doctrine_Core::ATTR_QUERY_CACHE) が偽になる. <pre> lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Query/Abstract.php 932 if ($this->_queryCache !== false && ($this->_queryCache || $this->conn->getAttribute(Doctrine_Core::ATTR_QUERY_CACHE))) { 933 $queryCacheDriver = $this->getQueryCacheDriver(); 934 $hash = $this->calculateQueryCacheHash(); 935 $cached = $queryCacheDriver->fetch($hash); </pre> 932 行目の Doctrine::ATTR_QUERY_CACHE は OpenPNE では下記部分で定義されている.見て分かる通り apc が有効でないと設定されない. <pre> lib/config/opProjectConfiguration.class.php 118 if (extension_loaded('apc')) 119 { ... 129 $cacheDriver = new Doctrine_Cache_Apc($options); 130 $manager->setAttribute(Doctrine::ATTR_QUERY_CACHE, $cacheDriver); </pre> h3. 修正案 キャッシュされた場合,そのハッシュが等しくないかどうかを確認したいという内容のテストであると思われるため, そしてキャッシュされた場合,そのハッシュが等しくないかどうかを確認したいという内容のテストであると思われるため, APC が入っていない環境でもテストは実行されるべき.そのために Doctrine::ATTR_QUERY_CACHE に new Doctrine_Cache_Array() をセットすることで環境に依存しないテストの実行ができるものと考えられる. <pre> diff --git a/test/unit/util/opDoctrineQueryTest.php b/test/unit/util/opDoctrineQueryTest.php index fc02677..9de61f6 100644 --- a/test/unit/util/opDoctrineQueryTest.php +++ b/test/unit/util/opDoctrineQueryTest.php @@ -21,6 +21,7 @@ $configuration = ProjectConfiguration::getApplicationConfiguration($_app, $_env, new sfDatabaseManager($configuration); Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_QUERY_CLASS, 'myQuery'); +Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_QUERY_CACHE, new Doctrine_Cache_Array()); $t = new lime_test(null, new lime_output_color()); </pre>