我正在测试一个使用辅助函数的类。我正在测试的功能如下:
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”加载,以便它可以在此函数中使用?
答案 0 :(得分:16)
我有这个问题,解决了确保:
setUp()
方法,则会调用parent::setUp()
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')) {
这可以防止在第一个测试用例执行后重新声明函数的尝试。