Ответ 1
У меня была эта проблема, я решил, что:
- Мой тестовый класс расширен TestCase.
- Если мой тестовый класс имел метод
setUp()
, он называлсяparent::setUp()
app_path() и схожие с ним функции.
Я тестирую класс 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);
}
Я знаю, что получаю ошибку, потому что "приложение" не создано, потому что я тестирую только мой класс, а не все приложение. Существуют ли другие эффективные способы получения корневого каталога моего проекта или есть способ заставить "приложение" загрузить, чтобы он мог использоваться в этой функции?
У меня была эта проблема, я решил, что:
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')) {
Это должно предотвратить попытку повторного объявления функций после выполнения первого тестового примера.