14

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

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);
}

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

4

3 回答 3

18

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

  1. 我的测试类扩展了 TestCase。
  2. 如果我的测试类有一个setUp()方法,它调用parent::setUp()

app_path() 和类似的功能在那之后起作用。

于 2014-07-07T09:41:57.237 回答
1

有一种方法可以模拟app()在与 laravel 环境完全隔离的情况下使用函数的辅助函数。考虑到您的包具有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));
        }

    }
于 2015-02-11T23:09:09.763 回答
0

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

if (!file_exists('newFunction')) {

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

于 2014-04-02T23:13:27.600 回答