为了账号安全,请及时绑定邮箱和手机立即绑定

使用连续 () 进行测试时出现的问题

使用连续 () 进行测试时出现的问题

PHP
FFIVE 2022-09-12 10:59:56
我有一个类 填充用户支付统计服务 与方法:public function fillStatisticForAllTime(): void    {        $firstDate = \DateTime::createFromFormat('Y-m-d H:i:s', $this->userPaymentsRepository->getTheOldestDate());        $lastDate = (new \DateTime())->setTime(0, 0, 0);        while ($firstDate < $lastDate) {            $this->fillStatistic($firstDate);            $firstDate->add(new \DateInterval('P1D'));        }private function fillStatistic(\DateTime $day): void    {        $dateFrom = $day->setTime(0, 0, 0);        $dateTo = clone $day;        $dateTo->setTime(23, 59, 59);        $statisticAll = $this->userPaymentsRepository            ->getSummaryStatistic(['dateFrom' => $dateFrom, 'dateTo' => $dateTo, 'onlyPaid' => false]);        $this->userPaymentsStatisticRepository->insertDailyStatistic($statisticAll, $day, false);        $statisticOnlyPaid = $this->userPaymentsRepository            ->getSummaryStatistic(['dateFrom' => $dateFrom, 'dateTo' => $dateTo, 'onlyPaid' => true]);        $this->userPaymentsStatisticRepository->insertDailyStatistic($statisticOnlyPaid, $day, true);    }}我试着写测试:public function testFillStatisticForAllTime(): void{    $dateFromFirst = (new \DateTime())->sub(new \DateInterval('P2D'))->setTime(0, 0, 0);    $dateToFirst = (new \DateTime())->sub(new \DateInterval('P2D'))->setTime(23, 59, 59);    $dateFromSecond = (new \DateTime())->sub(new \DateInterval('P1D'))->setTime(0, 0, 0);    $dateToSecond = (new \DateTime())->sub(new \DateInterval('P1D'))->setTime(23, 59, 59);    $statistic = ['addPeopleFromPlugin' => 10];    $statisticOnlyPaid = ['addPeopleFromPlugin' => 7];    $this->userPaymentsRepositoryMock->expects($this->once())        ->method('getTheOldestDate')        ->willReturn($dateFromFirst->format('Y-m-d H:i:s'));
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

这里的主要问题是你的变量是可变对象(通过引用传递)

此外,在测试后会检查模拟断言,并且某些变量已更改。

修复:在使用任何日期之前克隆它(“分离”与原始变量)。

public function fillStatisticForAllTime(): void

{

    $firstDate = \DateTime::createFromFormat('Y-m-d H:i:s', $this->userPaymentsRepository->getTheOldestDate());

    $lastDate  = (new \DateTime())->setTime(0, 0, 0);

    while ($firstDate < $lastDate) {

        $this->fillStatistic(clone $firstDate); // <--------------- clone date

        $firstDate->add(new \DateInterval('P1D'));

    }

}



private function fillStatistic(\DateTime $day): void

{

    $dateFrom = clone $day; // <----------------------------------- clone date

    $dateFrom->setTime(0, 0, 0);

    $dateTo = clone $day;

    $dateTo->setTime(23, 59, 59);


    $statisticAll = $this->userPaymentsRepository

        ->getSummaryStatistic(['dateFrom' => $dateFrom, 'dateTo' => $dateTo, 'onlyPaid' => false]);

    $this->userPaymentsStatisticRepository->insertDailyStatistic($statisticAll, $day, false);


    $statisticOnlyPaid = $this->userPaymentsRepository

        ->getSummaryStatistic(['dateFrom' => $dateFrom, 'dateTo' => $dateTo, 'onlyPaid' => true]);

    $this->userPaymentsStatisticRepository->insertDailyStatistic($statisticOnlyPaid, $day, true);

}

顺便说一句,你的第二种方法之所以有效,是因为你创建了一个新对象(从原始变量“detact”)


为了避免将来出现类似的错误,您可能需要使用不可变的日期对象。


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号