I'm trying to get my head around PHP namespaces and testing with PHPUnit.
These tests from Codewars pass when I run phpunit test.php
in the command line on Windows:
<?php
require 'solution.php';
use PHPUnit\Framework\TestCase;
class myTests extends TestCase {
public function testExamples() {
$this->assertEquals(pair_sum([1,9,2,8,3,7,4,6,5,5,13,14,11,13,-1],10),6);
$this->assertEquals(pair_sum([1,2,3,1],3),1);
$this->assertEquals(pair_sum([1,3,2,2],4),2);
$this->assertEquals(pair_sum([1],4),false);
$this->assertEquals(pair_sum([2,3,10,-5],5),2);
}
}
However, when I comment out use PHPUnit\Framework\TestCase;
I get Class 'TestCase' not found
which makes sense since there is no reference to the needed classes/functions.
What's confusing me though is that lots of answers here on SO about namespacing claim that the use
keyword is NOT a substitute for include/require
and that the classes still need to be included/autoloaded(?).
I'm not using any autoloading here - just a solution.php
file and the tests above in a test.php
file.
Can someone please explain what I'm missing here? How come the tests work without any explicit including of the PHPunit functionality?
I should mention that I have PHPUnit installed globally via Composer.
use doesn't include anything. It just imports the specified namespace (or class) to the current scope, you need to have an autoloader set up in order to include the file in which the namespace is defined. Read more about autoloading here:http://php.net/manual/en/language.oop5.autoload.php
The include statement includes and evaluates the specified file.
Example:
<?php
$color = 'green';
$fruit = 'apple';
?>
test.php
<?php
echo "A $color $fruit"; // A
include 'vars.php';
echo "A $color $fruit"; // A green apple
?>
To make namespaces clear (ignore load of the class file here)
So in one php-file:
namespace xyz {
class a {}
class b {}
}
namespace abc {
use xyz\a;
new a();
new \xyz\b();
class b extends a {}
}
namespace {
use abc\b as aa;
use xyz\b as bb;
new bb;
new aa;
}
Namespace are for preventing name-conflicts!
Like @deceze said, the PHPUnit did the job for you, but don't think that use will not require the file included.
Look with atention to the structure: https://phpunit.de/manual/current/en/database.html#database.tip-use-your-own-abstract-database-testcase
PRO-TIP: Open the phpunit files that you'll understand better.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With