如何在phpunit测试中包含文件?

时间:2016-05-24 16:11:46

标签: php testing include phpunit phpstorm

我在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'是对的。

3 个答案:

答案 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()