首页 > 解决方案 > Laravel:如何将标头添加到 Mockery 模拟响应类?

问题描述

我有一个中间件来强制对 Json 的每个响应:

JsonResponseMiddleware.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\ResponseFactory;

class JsonResponseMiddleware
{

    /**
     * @var ResponseFactory
     */
    protected $responseFactory;

    /**
     * JsonResponseMiddleware constructor.
     */
    public function __construct(ResponseFactory $responseFactory)
    {
        $this->responseFactory = $responseFactory;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        // First, set the header so any other middleware knows we're
        // dealing with a should-be JSON response.
        $request->headers->set('Accept', 'application/json');

        // Get the response
        $response = $next($request);


        // If the response is not strictly a JsonResponse, we make it
        if (!$response instanceof JsonResponse) {
            $response = $this->responseFactory->json(
                $response->content(),
                $response->status(),
                $response->headers->all()
            );
        }

        return $response;
    }
}

这是我正在写的测试:

<?php

namespace Tests\Unit\Middlewares;

use App\Http\Middleware\JsonResponseMiddleware;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\ResponseFactory;
use Tests\TestCase;

class JsonResponseTest extends TestCase
{
    public function test_response()
    {
        $response = \Mockery::Mock(Response::class)
            ->shouldReceive('content')
            ->shouldReceive('status')
            ->shouldReceive('headers')
            ->getMock();

        $request = Request::create('/', 'GET');

        $middleware = $this->app->make(JsonResponseMiddleware::class);

        $middleware->handle($request, function () use ($response) {
            return $response;
        });

    }
}

我得到错误

Error : Call to a member function all() on null

(当然是指$response->headers->all())。

如果我删除最后一个->shouldReceive('headers'),我会得到同样的错误。所以,我想我需要在模拟的 $response 中添加一些假标题。但是怎么做?

谢谢

标签: phplaravel

解决方案


推荐阅读