我在phpunit测试中包含一个文件时遇到了一些麻烦。例如:当我在PhpStorm中执行以下代码时,我得到了预期的输出。
代码:
class NifvalidationTest extends PHPUnit_Framework_TestCase
{
public function test_apiRequest()
{
$result = 1+1;
$this->assertEquals(2, $result);
}
}
输出:
Testing started at 16:58 ...
PHPUnit 5.2.12 by Sebastian Bergmann and contributors.
Time: 120 ms, Memory: 11.50Mb
OK (1 test, 1 assertion)
Process finished with exit code 0
但是当我需要使用include从另一个类访问一个方法时,我得不到预期的输出。举个例子,当我执行以下代码时:
class NifvalidationTest extends PHPUnit_Framework_TestCase
{
public function test_apiRequest()
{
include('/../nifvalidation.php');
$result = 1+1;
$this->assertEquals(2, $result);
}
}
我得到的不是预期的输出:
Testing started at 17:05 ...
PHPUnit 5.2.12 by Sebastian Bergmann and contributors.
Process finished with exit code 0
关于包含为什么会破坏测试的任何想法?
注1:在上面的示例中,我不需要包含该文件,但我需要在另一个测试中。
注2:文件的路径&nbspvalidation.php'是对的。
答案 0 :(得分:6)
我认为你的包含路径是错误的。
你的结构可能有点像这样
ParentDir
- > nifvalidation.php
- > testsFolder
- > NifvalidationTest.php
而不是
include('/../nifvalidation.php')
使用
include(dirname(__FILE__)."/../nifvalidation.php");
答案 1 :(得分:5)
从命令行调用测试时,可以使用bootstrap
flag来包含任何文件,定义常量,并加载所有变量,类等。
--bootstrap <file> A "bootstrap" PHP file that is run before the tests.
例如,创建一个autoload.php
来定义常量并包含您的文件,然后您可以从命令行调用它:
phpunit --bootstrap autoload.php testsFolder/NifvalidationTest
对于更自动化的方法,您还可以create a phpunit.xml file包含引导信息:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="autoload.php">
<testsuites>
<testsuite name="Nifvalidation Test Suite">
<directory>./testsFolder</directory>
</testsuite>
</testsuites>
</phpunit>
在这种特定情况下,根据您对nifvalidation.php
内容的评论退出脚本,因为未定义PS_VERSION
。如果您正在进行单独的单元测试,只需要定义一个虚拟常量,那么您可以定义它在测试环境中存在。然后,您只需引导您的nifvalidation.php
文件。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="../nifvalidation.php">
<testsuites>
<testsuite name="Nifvalidation Test Suite">
<directory>./testsFolder</directory>
</testsuite>
</testsuites>
<php>
<const name="PS_VERSION" value="whatever you need here"/>
</php>
</phpunit>
答案 2 :(得分:1)
使用require()
或require_once()
代替include()