单元测试时使用 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 - 输入未通过单元测试

PHP单元,使用单元测试测试laravel日志消息

Laravel 单元测试断言函数总是失败

Laravel 5 单元测试 - 在 null 上调用成员函数 connection()

Laravel 中的单元测试:设置当前经过身份验证的用户时出错

在 Laravel 中使用 MySQL 数据库连接运行多个单元测试时出错