Подтвердить что ты не робот

Использование вспомогательных функций Laravel при модульном тестировании

Я тестирую класс I, который использует вспомогательную функцию. Функция, которую я тестирую, выглядит так:

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

Я знаю, что получаю ошибку, потому что "приложение" не создано, потому что я тестирую только мой класс, а не все приложение. Существуют ли другие эффективные способы получения корневого каталога моего проекта или есть способ заставить "приложение" загрузить, чтобы он мог использоваться в этой функции?

4b9b3361

Ответ 1

У меня была эта проблема, я решил, что:

  • Мой тестовый класс расширен TestCase.
  • Если мой тестовый класс имел метод setUp(), он назывался parent::setUp()

app_path() и схожие с ним функции.

Ответ 2

Существует способ издеваться над вспомогательными функциями, которые используют функцию 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));
        }

    }

Ответ 3

Я просто столкнулся с этой проблемой, и мое решение состоит в том, чтобы обернуть содержимое всего содержимого helpers.php с помощью

if (!file_exists('newFunction')) {

Это должно предотвратить попытку повторного объявления функций после выполнения первого тестового примера.