首页 > 解决方案 > 调用未定义的方法 Illuminate\Container\Container::getLocale() | 拉拉维尔 8

问题描述

单元测试对我来说比功能测试更难,我正在尝试编写一个与我的中间件相关的单元测试,但是出了什么问题。有人可以帮我修复这个错误,或者为这个中间件编写一个正常的单元测试。

我的中间件

<?php

namespace App\Http\Middleware;

use App\Services\SettingsService;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;

final class Locale
{
    private SettingsService $settingsService;

    public function __construct(SettingsService $settingsService)
    {
        $this->settingsService = $settingsService;
    }

    public function handle(Request $request, Closure $next): mixed
    {
        $locale = $this->settingsService->get('language', app()->getLocale());
        app()->setLocale($locale);

        return $next($request);
    }
}

我的测试

<?php

namespace Tests\Unit;

use App\Http\Middleware\Locale;
use App\Services\SettingsService;
use Illuminate\Http\Request;
use PHPUnit\Framework\TestCase;

class LocaleMiddlewareTest extends TestCase
{
    /**
     * A basic unit test example.
     *
     * @return void
     */
    public function test_example()
    {
        $request = new Request;

        $settingsService = $this->getMockBuilder(SettingsService::class)->disableOriginalConstructor()->getMock();
        $middleware = new Locale($settingsService);

        $middleware->handle($request, function ($req) {
            $this->assertEquals('en', app()->getLocale());
        });
    }
}

标签: laravelphpunit

解决方案


你应该使用Tests\TestCase而不是PHPUnit\Framework\TestCase

//use PHPUnit\Framework\TestCase
use Tests\TestCase;

class LocaleMiddlewareTest extends TestCase{


//.... other code
}

推荐阅读