【问题标题】:How to avoid ThrottleRequestsException in Laravel unit test?如何避免 Laravel 单元测试中的 ThrottleRequestsException?
【发布时间】:2020-01-18 00:50:18
【问题描述】:

我正在开发一个具有日期逻辑的应用程序,即将根据日期从数据库中返回一些内容,并且只返回该日期的相关数据。我将如何进行单元测试?有 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')]);

    }
}

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

【问题讨论】:

  • 您收到的实际错误信息是什么?
  • @KoalaYeung Illuminate\Http\Exceptions\ThrottleRequestsException : 尝试次数过多。
  • 尝试将$this-&gt;json('GET', '/api/data');更改为$this-&gt;withoutMiddleware()-&gt;json('GET', '/api/data');,看看是否避免了异常。

标签: php laravel unit-testing phpunit


【解决方案1】:

this comment of a similar problem 中所述,您可以通过在TestCase getjson 调用之前应用withoutMiddleware 来禁用测试中的默认Laravel 速率限制。

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')]);

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多