diff --git a/dev/TestRunner.php b/dev/TestRunner.php index 4c257e6edb4..741cc9a5198 100644 --- a/dev/TestRunner.php +++ b/dev/TestRunner.php @@ -92,6 +92,10 @@ public static function use_test_manifest() { Config::inst()->pushConfigStaticManifest(new SS_ConfigStaticManifest( BASE_PATH, true, isset($_GET['flush']) )); + + // Invalidate classname spec since the test manifest will now pull out new subclasses for each internal class + // (e.g. Member will now have various subclasses of DataObjects that implement TestOnly) + DataObject::clear_classname_spec_cache(); } public function init() { diff --git a/model/DataObject.php b/model/DataObject.php index fc5fb6bbe6a..31975b968a1 100644 --- a/model/DataObject.php +++ b/model/DataObject.php @@ -192,6 +192,14 @@ public static function set_validation_enabled($enable) { * @var [string] - class => ClassName field definition cache for self::database_fields */ private static $classname_spec_cache = array(); + + /** + * Clear all cached classname specs. It's necessary to clear all cached subclassed names + * for any classes if a new class manifest is generated. + */ + public static function clear_classname_spec_cache() { + self::$classname_spec_cache = array(); + } /** * Return the complete map of fields on this object, including "Created", "LastEdited" and "ClassName". @@ -202,7 +210,7 @@ public static function set_validation_enabled($enable) { */ public static function database_fields($class) { if(get_parent_class($class) == 'DataObject') { - if(!isset(self::$classname_spec_cache[$class])) { + if(empty(self::$classname_spec_cache[$class])) { $classNames = ClassInfo::subclassesFor($class); $db = DB::getConn();