【问题标题】:Laravel: Unable to use include(app_path()) in PHPunit testsLaravel:无法在 PHPunit 测试中使用 include(app_path())
【发布时间】:2021-08-20 05:22:06
【问题描述】:

我正在尝试对文件 '\app\Custom\custom.php` 中的自定义函数运行单元测试

我正在尝试在我的测试文件中包含自定义文件:

include(app_path().'/Custom/custom.php');

但我得到了错误:

PHP Fatal error:  Uncaught Error: Call to undefined method Illuminate\Container\Container::path()

根据@habeebdev的回答,我试过了:

文件路径添加到composer.json

...
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        },
        "files": ["app/Custom/custom.php"]
    },
...

laravel/tests/Unit/PracticeTest.php

<?php

namespace Tests\Unit;

use Tests\TestCase;
use App\Models\User;
use Illuminate\Support\Facades\DB;

class PracticeTest extends TestCase
{
    /**
     * A basic unit test example.
     *
     * @return void
     */
    public function test_trueExample()
    {

        $user = User::find(1);

        $this->actingAs($user)
             ->assertEquals(true, can_transact());

    }
}

错误:

 Call to undefined function Tests\Unit\can_transact()

编辑:

我的custom.php 文件中有一个namespace App\Http\Controllers。一旦我为函数添加前缀App\Http\Controllers\can_transact(),它就可以正常工作(感谢@apokryfos)

【问题讨论】:

    标签: php laravel phpunit


    【解决方案1】:

    您必须自动加载自定义文件。为此,请在 composer.json 的“autoload-dev”部分中包含 custom.php

    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
         },
         "files": ["app/Custom/custom.php"]
    },
    

    运行composer dump-autoload

    现在您可以在测试脚本中调用自定义函数。无需包含该文件。


    关于命名空间,请将您的 custom.php 命名空间更改为App\Custom。对自定义文件使用 Controller 命名空间并不好。另外,我建议您阅读 OOP 和 laravel 基础知识。

    【讨论】:

    • 我会更进一步说,如果您发现自己需要手动包含这些类型的文件并且正在使用 composer,那么就有问题了。
    • 您好,我已将这一行添加到 composer.json 并运行 composer dump-autoload 即可完成。但是,当我在测试中调用该函数时,我仍然得到Call to undefined function
    • @apokryfos 你能详细说明一下吗。
    • @matt 你需要确保你的作曲家自动加载器是唯一包含的东西。之后,作曲家将负责所有其他包括
    • @matt 您可能应该使用custom.php 中的代码更新您的问题,但文件可能是命名空间的,因此您需要通过以与您相同的方式提供该命名空间来引用其中声明的函数会上课
    猜你喜欢
    • 2019-03-06
    • 2013-04-14
    • 2021-12-04
    • 2014-09-11
    • 2015-01-24
    • 2014-09-21
    • 2017-07-27
    • 2018-10-23
    • 1970-01-01
    相关资源
    最近更新 更多