我正在尝试使用像这样的命名空间测试来覆盖内置的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
就好像忽略了命名空间的函数,而只是调用了内置函数,我错过了什么?
答案 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模拟文件系统。
注意:对于您的示例,我会推荐前者。