Javier Villanueva
Javier Villanueva

Reputation: 4058

Namespaced function not running on PHPUnit test

I'm trying to override a built in php function using a namespaced test like this:

Original Class:

<?php
namespace My\Namespace;

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

Unit Test

<?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);
    }
}

In this case the file_exists function in my test should always return true, however when I run PHPUnit I get:

PHPUnit 5.7.21 by Sebastian Bergmann and contributors.

There was 1 failure:

1) My\Namespace\Test\Unit\Console\Command\OverrideCommandTest::testMyFileExists
Failed asserting that false is true.

It's as if the namespaced function is being ignored and it's just calling the built in function instead, am I missing something?

Upvotes: 0

Views: 387

Answers (1)

localheinz
localheinz

Reputation: 9582

According to your code sample, you define the function file_exists() in the namespace My\Namespace\Test\Unit\Console\Command:

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

function file_exists($path)
{
    return true;
}

so of course, you actually never override the function file_exists() in the root namespace.

As far as I know, you can't do that. Whenever you would try to define a function that already exists, a fatal error will be triggered, see https://3v4l.org/JZHcp.

However, if what you want to achieve is asserting that OverrideCommand::myFileExists() returns true if a file exists, and false if it doesn't, you can do one of the following

Refer to files which do and do not exist in your test

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

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

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

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

Mock the file system

Use https://github.com/mikey179/vfsStream to mock the file system.

Note: For your example, I would recommend the former.

Upvotes: 1

Related Questions