2011-09-20 70 views
5

我需要创建一个自动加载到我的应用程序。我不想依赖文件系统中的文件,那么如何模拟一个新的调用?或者你如何测试一个自动加载器类? 谢谢。的PHPUnit - 测试自动加载类

回答

1

专门为测试磁带自动加载机创建了一些类文件,并将其放置在一个单独的目录(同级测试),您可以与磁带自动加载注册。使用class_exists($class, false)来测试是否加载类而不调用自动加载器。

注意:如果您将自动加载器设计为非静态,以便您可以为测试实例化单独的实例而不是测试活动的实例,它会有所帮助。

这里是我的自定义自动加载的autoload()法为例测试:

function test_autoload_loadsExistingClass() { 
    $this->fixture->registerPrefix('TestClasses', self::$root . 'models'); 
    if (class_exists('TestClasses_Autoloader_Foo', false)) { 
     self::error('Class TestClasses_Autoloader_Foo is already loaded'); 
    } 
    $this->fixture->autoload('TestClasses_Autoloader_Foo'); 
    if (!class_exists('TestClasses_Autoloader_Foo', false)) { 
     self::fail('Class TestClasses_Autoloader_Foo failed to load'); 
    } 
} 

function test_autoload_silentlyIgnoresMissingClasses() { 
    $this->fixture->registerPrefix('Foo', self::$root . 'models'); 
    $this->fixture->autoload('Foo_Bar'); 
} 

function test_autoload_searchesIncludePathForUnknownPrefix() { 
    if (class_exists('TestClasses_Autoloader_Foo', false)) { 
     self::error('Class TestClasses_Autoloader_Foo is already loaded'); 
    } 
    set_include_path(self::$root . 'include' . PATH_SEPARATOR . self::$savedIncludePath); 
    $this->fixture->autoload('TestClasses_Autoloader_Foo'); 
    if (!class_exists('TestClasses_Autoloader_Foo', false)) { 
     self::fail('Class TestClasses_Autoloader_Foo failed to load'); 
    } 
} 

更新:哇,我不知道我怎样将我错过了”不希望依赖于文件系统中的文件“,但这很关键。您需要将自己的自动加载器的方法(例如includeFile($path))拨打include。这将允许您在测试过程中模拟该方法,因此您不需要将文件包含在磁盘中。除此之外,您还可以像往常一样测试类:将其输入(如上所述)以自动加载类,并在应用时验证您的类是否使用正确的路径调用includeFile()

function testAutoloadLoadsExistingClass() { 
    $fixture = $this->getMock('MyAutoloader', 
      array('includeFile'), // mock the call to `include` 
      array(...));   // constructor args 
    $fixture->expects($this->once()) 
      ->method('includeFile') 
      ->with('My/Package/Class') 
      ->will($this->returnValue(true)); 
    self::assertTrue($fixture->autoload('My_Package_Class')); 
} 
4

或者你如何测试一个自动加载类

恕我直言,你并不需要在单位所有测试磁带自动加载机。

如果您引导您的应用程序会崩溃醚真的很难,因为它可以找到所有需要的类或磁带自动加载机工作正常。

在测试套件每一个测试将测试磁带自动加载机是能够加载“下的测试类”的,所以我不会担心得多单元测试它。

也许称之为“集成测试等副作用,”如果你想,但我想说这就是不够好。

如果你不认为多数民众赞成不够好我把需要/ include语句在一个受保护的功能和覆盖测试自动加载该函数并检查它是否接收到正确的价值观。

+1

1为“集成测试作为副作用”。我喜欢。 – GordonM

0

你如何测试一个自动加载类?

依赖于自动装卸类做什么。例如,您可以测试注册自动加载回调是否与spl_autoload_register一起使用。

或者,如果你的自动加载机提供了一个加载类和库的接口,以检查是否所有的类都被加载LoadLibrary功能。但这通常依赖于文件系统(我认为这很好)。