在单元测试时使用Laravel辅助函数

时间:2013-11-01 12:44:57

标签: php unit-testing phpunit laravel-4

我正在测试一个使用辅助函数的类。我正在测试的功能如下:

public function upload(UploadedFile $file)
{
    $file = $file->move(base_path() . '/temp');
    $file = new FileSystemPicture($file);

    return $file;
}

当我运行测试并且它命中辅助函数时,它说:

PHP Fatal error:  Call to a member function make() on a non-object

我已将助手函数跟踪为以下代码:

function base_path($path = '')
{
    return app()->make('path.base').($path ? '/'.$path : $path);
}

我知道我收到了错误,因为“app”尚未创建,因为我只测试了我的类,而不是整个应用程序。是否有其他有效的方法来获取我的项目的根目录,或者是否有办法强制“app”加载,以便它可以在此函数中使用?

3 个答案:

答案 0 :(得分:16)

我有这个问题,解决了确保:

  1. 我的测试类扩展了TestCase。
  2. 如果我的测试类有setUp()方法,则会调用parent::setUp()
  3. app_path()和类似的功能在此之后起作用。

答案 1 :(得分:1)

有一种方法可以在与laravel环境完全隔离的情况下模拟使用app()函数的辅助函数。考虑到您的包具有illuminate/support依赖性,您可以执行以下操作:

<?php

    class Test extends PHPUnit_Framework_TestCase
    {
        protected function mockApplication(array $methods = [])
        {
            return $this->getMock('Illuminate\Foundation\Application', $methods);
        }

        public function testHelperFunction()
        {
            $appMock = $this->mockApplication(['make']);

            \Illuminate\Support\Facades\Facade::setFacadeApplication($appMock);

            $testPath = "my/path";
            $myPath = "otherPath";

            $expectedValue = "{$testPath}/{$myPath}";

            $appMock->expects($this->once())
                    ->method('make')->with('path.base')
                    ->will($this->returnCallback(function () use ($testPath) {
                        return $testPath;
                    }));

            $this->assertSame($expectedValue, base_path($myPath));
        }

    }

答案 2 :(得分:0)

我刚遇到这个问题,我的解决方案是用

包装整个helpers.php内容
if (!file_exists('newFunction')) {

这可以防止在第一个测试用例执行后重新声明函数的尝试。