Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
PHPUnit-测试自动加载器类_Php_Mocking_Phpunit_Autoload_Spl Autoload Register - Fatal编程技术网

PHPUnit-测试自动加载器类

PHPUnit-测试自动加载器类,php,mocking,phpunit,autoload,spl-autoload-register,Php,Mocking,Phpunit,Autoload,Spl Autoload Register,我需要为我的应用程序创建一个自动加载器。我不想依赖文件系统中的文件,因此如何模拟新调用?或者如何测试自动加载器类? 谢谢。创建一些专门用于测试自动加载器的类文件,并将它们放在一个单独的目录(与测试同级)中,您可以向自动加载器注册。使用class\u exists($class,false)测试是否在不调用自动加载程序的情况下加载了类 注意:如果您将自动加载器设计为非静态的,这样您就可以为测试实例化一个单独的实例,而不是测试活动的实例,这会有所帮助 以下是我的自定义autoloader的autol

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

创建一些专门用于测试自动加载器的类文件,并将它们放在一个单独的目录(与测试同级)中,您可以向自动加载器注册。使用
class\u exists($class,false)
测试是否在不调用自动加载程序的情况下加载了类

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

以下是我的自定义autoloader的
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');
    }
}
更新:哇,我不知道我怎么会漏掉你问题中的“我不想依赖文件系统中的文件”,但这很关键。您需要在自动加载器自己的方法中调用
include
(例如
includeFile($path)
)。这将允许您在测试期间模拟该方法,这样就不会涉及磁盘上的文件。除此之外,您还可以像平时一样测试该类:向它提供要自动加载的类的输入(如上所述),并验证您的类在应该调用时是否使用正确的路径调用
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'));
}
或者如何测试自动加载器类

我想你根本不需要对你的自动加载器进行单元测试

如果你引导你的应用程序,它会很难崩溃,因为它可以找到所有需要的类,或者你的自动加载器工作正常

测试套件中的每一个测试都将测试autoloader是否能够加载“测试中的类”,因此我不必担心对它进行单元测试

如果你愿意,可以称之为“作为副作用的集成测试”,但我认为这已经足够好了

如果您认为这不够好,我会将require/include语句放在受保护的函数中,并在测试自动加载程序中重写该函数,并检查它是否接收到正确的值

如何测试自动加载器类

取决于autoloader类的功能。例如,您可以测试注册自动加载回调是否适用于
spl\u autoload\u register

或者,如果您的自动加载器提供加载库的所有类和接口的
LoadLibrary
函数,以检查是否已加载所有类。但这通常取决于文件系统(我认为这是可以的)