14

ヘルパー関数を使用する作成したクラスをテストしています。私がテストしている機能は次のようになります。

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

アプリケーション全体ではなくクラスのみをテストしているため、「アプリ」が作成されていないため、エラーが発生していることがわかります。プロジェクトのルート ディレクトリを取得する他の効果的な方法はありますか、またはこの機能で使用できるように「アプリ」を強制的にロードする方法はありますか?

4

3 に答える 3

18

私はこの問題を抱えていましたが、次のことを確認して解決しました:

  1. 私のテストクラスは TestCase を拡張しました。
  2. 私のテストクラスにsetUp()メソッドがあった場合、それは呼び出されましたparent::setUp()

その後、 app_path() および同様の関数が機能しました。

于 2014-07-07T09:41:57.237 に答える
1

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

    }
于 2015-02-11T23:09:09.763 に答える
0

私はこの問題に遭遇しました。私の解決策は、helpers.php の内容全体を次のようにラップすることです。

if (!file_exists('newFunction')) {

これにより、最初のテスト ケースの実行後に関数を再宣言する試みを防ぐことができます。

于 2014-04-02T23:13:27.600 に答える