首页 > 解决方案 > 如何避免 Laravel 单元测试中的 ThrottleRequestsException?

问题描述

我正在开发一个具有日期逻辑的应用程序,即将根据日期从数据库中返回一些内容,并且只返回该日期的相关数据。我将如何进行单元测试?有 24 个日期返回 24 条不同的数据,我想可能会做这样的事情,

public function testGetActiveData()
{
    $this->withoutExceptionHandling();

    //Create the data
    $dates = CarbonPeriod::create('2019-12-01', '2019-12-12');
    $start_date = new Carbon("2019-12-01 00:00:00");

    $dates->forEach(function($date){
        $data = factory(Data::class)->create([
            'date_playable' => $date->toDateTimeString()
        ]);
        factory(LinkedData::class, 15)->create([
            'data_id' => $data->id
        ]);
    });

    for($day = 1; $day <= 24; $day++) {
        if($day = 1) {
            Cache::put('data_date', $start_date->toDateTimeString(), now()->addMinutes(30));
        } else {
            Cache::put('data_date', $start_date->toDateTimeString()->addDays($day), now()->addMinutes(30));
        }

        $response = $this->json('GET', '/api/data');

        $response->assertJson(['date_playable' => Cache::get('data_date')]);

    }
}

但是由于尝试过多而导致此错误,是否有更好的方法来测试它?很明显,我正在测试未来的日期,所以我将“未来日期”推入缓存,然后使用它还有更好的方法吗?

标签: phplaravelunit-testingphpunit

解决方案


正如在类似问题的评论中所述,您可以通过在TestCase或调用之前应用withoutMiddleware来禁用测试中的默认 Laravel 速率限制。 getjson

public function testGetActiveData()
{
    $this->withoutExceptionHandling();

    //Create the data
    $dates = CarbonPeriod::create('2019-12-01', '2019-12-12');
    $start_date = new Carbon("2019-12-01 00:00:00");

    $dates->forEach(function($date){
        $data = factory(Data::class)->create([
            'date_playable' => $date->toDateTimeString()
        ]);
        factory(LinkedData::class, 15)->create([
            'data_id' => $data->id
        ]);
    });

    for($day = 1; $day <= 24; $day++) {
        if($day = 1) {
            Cache::put('data_date', $start_date->toDateTimeString(), now()->addMinutes(30));
        } else {
            Cache::put('data_date', $start_date->toDateTimeString()->addDays($day), now()->addMinutes(30));
        }

        // circumvent the throttle rate limit middleware
        // with the "withoutMiddleware" method
        $response = $this->withoutMiddleware()->json('GET', '/api/data');

        $response->assertJson(['date_playable' => Cache::get('data_date')]);

    }
}

推荐阅读