在Laravel进行单元测试时,setUp / tearDown灯具

时间:2017-10-27 11:25:39

标签: laravel unit-testing phpunit laravel-5.4

我正在尝试编写一个单元测试来检查使用base_path()帮助器的属性方法,但是,我得到了一个例外:Call to undefined method Illuminate\Container\Container::basePath()

完整的堆栈跟踪如下:

\vendor\laravel\framework\src\Illuminate\Foundation\helpers.php:179
\app\Message.php:47
\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php:432
\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php:333
\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php:306
\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:1279
\tests\Unit\MessageTest.php:59

我已将其追踪到使用setUptearDown灯具 - 即使我有:

public function setUp()
{
    //$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/../..";
}

public function tearDown()
{
    //unset($_SERVER['DOCUMENT_ROOT']);
}

我收到了上述错误。如果我完全移除灯具,错误就会消失。

我用setUpBeforeClasstearDownAfterClass替换了给定的方法后,错误消失了,但我想知道是什么导致它。

据我所知,这是vanilla Laravel 5.4安装(完全是5.4.36),但是它安装了额外的库(我真的不能说是什么库)。我没有设置phpunit.xml文件,但公平地说我不知道​​该找什么。

我已经使用Laravel(相同版本)的全新安装进行了测试,它确实是开箱即用的(使用未触及的phpunit.xml文件);在版本5.5上它没有。

2 个答案:

答案 0 :(得分:1)

尝试在自己的内部调用父类setUp和tearDown方法。

像这样:

public function setUp()
{
    parent::setUp()
    //$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/../..";
}

public function tearDown()
{
    parent::tearDown()
    //unset($_SERVER['DOCUMENT_ROOT']);
}

答案 1 :(得分:0)

确保在继续向下之前先调用父 setUp() 和 tearDown()。在此处查看代码

public function setUp()
{
    parent::setUp();
    //$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/../..";
}

public function tearDown()
{
    parent::tearDown();
    //unset($_SERVER['DOCUMENT_ROOT']);
}