Namespaced函数未在PHPUnit测试上运行

时间:2017-06-23 21:53:45

标签: php unit-testing namespaces mocking phpunit

我正在尝试使用像这样的命名空间测试来覆盖内置的php函数:

原始类:

python: can't open file '/home/speedtest-cli/speedtest-cli': [Errno 2] No such file or directory 

单元测试

<?php
namespace My\Namespace;

class OverrideCommand
{
    public function myFileExists($path)
    {
        return file_exists($path);
    }
}

在这种情况下,我的测试中的<?php namespace My\Namespace\Test\Unit\Console\Command; function file_exists($path) { return true; } class OverrideCommandTest extends \PHPUnit_Framework_TestCase { /** * @var OverrideCommand */ protected $command; protected function setUp() { $this->command = new \My\Namespace\OverrideCommand(); } public function testMyFileExists() { $result = $this->command->myFileExists('some/path/file.txt'); $this->assertTrue($result); } } 函数应该总是返回true,但是当我运行PHPUnit时,我得到:

file_exists

就好像忽略了命名空间的函数,而只是调用了内置函数,我错过了什么?

1 个答案:

答案 0 :(得分:1)

根据您的代码示例,您可以在命名空间file_exists()中定义函数My\Namespace\Test\Unit\Console\Command

namespace My\Namespace\Test\Unit\Console\Command;

function file_exists($path)
{
    return true;
}

当然,您实际上从不覆盖根命名空间中的函数file_exists()

据我所知,你不能这样做。每当您尝试定义已存在的函数时,都会触发致命错误,请参阅https://3v4l.org/JZHcp

但是,如果您要实现的目的是声明OverrideCommand::myFileExists()如果文件存在则返回true,而如果文件不存在则false,则可以执行其中一项操作以下

请参阅测试中存在和不存在的文件

public function testMyFileExistsReturnsFalseIfFileDoesNotExist()
{
     $command = new OverrideCommand();

     $this->assertTrue($command->myFileExists(__DIR__ . '/NonExistentFile.php');
}

public function testMyFileExistsReturnsTrueIfFileExists()
{
     $command = new OverrideCommand();

     $this->assertTrue($command->myFileExists(__FILE__);
}

模拟文件系统

使用https://github.com/mikey179/vfsStream模拟文件系统。

注意:对于您的示例,我会推荐前者。