单元测试时使用 Laravel 辅助函数
Posted
技术标签:
【中文标题】单元测试时使用 Laravel 辅助函数【英文标题】:Using Laravel helper functions when unit testing 【发布时间】:2013-11-12 16:02:59 【问题描述】:我正在测试我创建的一个使用辅助函数的类。我正在测试的功能如下:
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”加载以便可以在这个函数中使用?
【问题讨论】:
【参考方案1】:我遇到了这个问题,解决了确保:
-
我的测试类扩展了 TestCase。
如果我的测试类有一个
setUp()
方法,它调用parent::setUp()
app_path() 和类似的函数在那之后工作。
【讨论】:
对于集成测试没问题,但是对于单元测试,您需要一种模拟辅助函数的方法。parent::setUp()
应该在调用任何辅助方法之前调用
要清楚,测试类应该扩展Tests\TestCase
,而不是PHPUnit\Framework\TestCase
【参考方案2】:
有一种方法可以在与 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));
【讨论】:
【参考方案3】:我刚遇到这个问题,我的解决方案是用
包装整个 helpers.php 内容if (!file_exists('newFunction'))
这应该防止在第一个测试用例执行后重新声明函数的尝试。
【讨论】:
以上是关于单元测试时使用 Laravel 辅助函数的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5 单元测试 - 在 null 上调用成员函数 connection()