簡體   English   中英

在單元測試時使用Laravel輔助函數

[英]Using Laravel helper functions when unit testing

我正在測試一個使用輔助函數的類。 我正在測試的功能如下:

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”加載,以便它可以在此功能中使用?

我有這個問題,解決了確保:

  1. 我的測試類擴展了TestCase。
  2. 如果我的測試類有一個setUp()方法,則調用parent::setUp()

app_path()和類似的函數在那之后起作用。

有一種方法可以模擬使用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));
        }

    }

我剛剛遇到這個問題,我的解決方案是將整個helpers.php內容包裝起來

if (!file_exists('newFunction')) {

這應該可以防止在第一個測試用例執行后重新聲明函數的嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM