嘲笑 php 测试中的 Carbon 对象
Carbon object in mockery php test
感谢您的宝贵时间。我已经去掉了 code/test.
中的绒毛
我最了解的是 setAttribute 需要两个字符串作为参数,但我传递的是 Carbon 对象,作为测试套件的 Mockery 不喜欢它?是这样吗,有没有更好的方法用Mockery/PHPUnit测试日期?其他测试和代码都有效,似乎只有这个测试有问题。
错误
1) Tests\Unit\Services\StageServiceTest::update_stage
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Mockery_13_App_Entities_Subcategory::setAttribute('stage_updated_at', object(Carbon\Carbon)). Either the method was unexpected or its arguments matched no expected argument list for this method
Objects: ( array (
'Carbon\Carbon' =>
array (
'class' => 'Carbon\Carbon',
'properties' =>
array (
),
),
))
小测试
$subcategory = \Mockery::mock(Subcategory::class);
$stage = \Mockery::mock(Stage::class);
$subcategory
->shouldReceive('setAttribute')
->with('stage_updated_at', Carbon::now())
->once();
$this->service->updateSubcategoryStage(self::SUBCATEGORY_ID, $stageId);
代码位
$subcategory->stage_updated_at = Carbon::now();
$subcategory->save();
从您的示例中看不出是谁在呼叫 setAttribute
。但我猜你可能正在使用 magic setters。
您的预期失败的原因是因为您正在比较两个不同的对象。来自文档:
When matching objects as arguments, Mockery only does the strict === comparison, which means only the same $object will match
您可以使用 equalTo
hamcrest 匹配器放宽比较:
$subcategory
->shouldReceive('setAttribute')
->with('stage_updated_at', equalTo(Carbon::now()))
->once();
你还是会惹上麻烦,因为时间总会有点偏差。幸运的是,Carbon 提供了一种“立即”修复以用于测试目的的方法。你只需要在你的测试用例中设置它:
Carbon::setTestNow('2020-01-31 12:13:14');
感谢您的宝贵时间。我已经去掉了 code/test.
中的绒毛我最了解的是 setAttribute 需要两个字符串作为参数,但我传递的是 Carbon 对象,作为测试套件的 Mockery 不喜欢它?是这样吗,有没有更好的方法用Mockery/PHPUnit测试日期?其他测试和代码都有效,似乎只有这个测试有问题。
错误
1) Tests\Unit\Services\StageServiceTest::update_stage
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Mockery_13_App_Entities_Subcategory::setAttribute('stage_updated_at', object(Carbon\Carbon)). Either the method was unexpected or its arguments matched no expected argument list for this method
Objects: ( array (
'Carbon\Carbon' =>
array (
'class' => 'Carbon\Carbon',
'properties' =>
array (
),
),
))
小测试
$subcategory = \Mockery::mock(Subcategory::class);
$stage = \Mockery::mock(Stage::class);
$subcategory
->shouldReceive('setAttribute')
->with('stage_updated_at', Carbon::now())
->once();
$this->service->updateSubcategoryStage(self::SUBCATEGORY_ID, $stageId);
代码位
$subcategory->stage_updated_at = Carbon::now();
$subcategory->save();
从您的示例中看不出是谁在呼叫 setAttribute
。但我猜你可能正在使用 magic setters。
您的预期失败的原因是因为您正在比较两个不同的对象。来自文档:
When matching objects as arguments, Mockery only does the strict === comparison, which means only the same $object will match
您可以使用 equalTo
hamcrest 匹配器放宽比较:
$subcategory
->shouldReceive('setAttribute')
->with('stage_updated_at', equalTo(Carbon::now()))
->once();
你还是会惹上麻烦,因为时间总会有点偏差。幸运的是,Carbon 提供了一种“立即”修复以用于测试目的的方法。你只需要在你的测试用例中设置它:
Carbon::setTestNow('2020-01-31 12:13:14');