Laravel扩展TestResponse类

5

我正在尝试向TestReponse类添加自定义断言,以便我可以创建如下代码:

$response = $this->json('POST', '/foo/bar');

$response->myCustomAssertion();

我尝试创建了一个扩展原有类的 App\TestResponse 类,并在 App\Provider\AppServiceProvider 类中进行绑定。
public function register()
{
    $this->app->bind('Illuminate\Foundation\Testing\TestResponse', function ($app) {
        return new App\TestResponse();
    });
}

但是$response->json()仍然返回原始结果,而不是我的自定义实现。

我该如何扩展TestResponse类?


1
它是“可宏化的”,您无需扩展即可添加方法..您可以通过对该类进行静态macro调用来在运行时添加方法。 - lagbox
@lagbox,您能将其添加为答案吗? - Camilo
2个回答

16

如果你想要更精细的控制,你也可以扩展 Illuminate\Foundation\Testing\TestResponse,正如你所做的那样,并在你的TestCase类中覆盖createTestResponse方法,返回你自定义响应类的实例:

// Laravel 8 and above
protected function createTestResponse($response)
{
    return tap(App\TestResponse::fromBaseResponse($response), function ($response) {
        $response->withExceptions(
            $this->app->bound(LoggedExceptionCollection::class)
                ? $this->app->make(LoggedExceptionCollection::class)
                : new LoggedExceptionCollection
        );
    });
}

// Before Laravel 8
protected function createTestResponse($response)
{
    return App\TestResponse::fromBaseResponse($response);
}

来自Illuminate\Foundation\Testing\Concerns\MakesHttpRequests


8

TestResponse 类使用 Macroable 特性,因此您可以在运行时添加宏函数。

TestResponse::macro('nameOfFunction', function (...) {
    ...
});

您可以将此代码添加到服务提供者的boot方法中,或者在需要调用该宏方法之前的任何位置添加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接