【发布时间】:2020-04-05 19:46:11
【问题描述】:
我是 php 单元测试的新手。如何在下面的函数中模拟日期。目前它正在获取当前日期。但我想将模拟中的日期更改为一个月的第一天。
function changeStartEndDate() {
if (date('j', strtotime("now")) === '1') {
$this->startDate = date("Y-n-j", strtotime("first day of previous month"));
$this->endDate = date("Y-n-j", strtotime("last day of previous month")) . ')';
} else {
$this->startDate = date("Y-n-j", strtotime(date("Y-m-01")));
$this->endDate = date("Y-n-j", strtotime("yesterday"));
}
}
我试过这样做,但它不起作用。
public function testServicesChangeStartEndDate() {
$mock = $this->getMockBuilder('CoreFunctions')
->setMethods(array('changeStartEndDate'))
->getMock();
$mock->method('changeStartEndDate')
->with(date("Y-n-j", strtotime(date("Y-m-01"))));
$this->assertSame(
'1',
$this->core->changeStartEndDate()
);
}
【问题讨论】:
-
您是在尝试测试 CoreFunction,还是将其用作不同测试用例的模拟?
-
我正在尝试测试 CoreFunctions
-
在这种情况下:您永远不需要模拟属于您的 CoreFunction 的任何内容。如果您为被测单元创建模拟,我认为这是一种代码气味。只有当您测试另一个使用您的核心功能的服务时,使用您的核心功能的模拟版本才有意义。我敢说对于这个测试用例,你不需要创建任何模拟。您正在尝试使用模拟来解决由于当前时间造成的副作用而遇到的问题。如果您将代码更改为没有副作用,则无需模拟任何内容。
-
如果你在
CoreFunctions中遇到了你想模拟的东西,这强烈表明你的函数/类/方法做的太多了,你应该把它移到额外的服务中.进行单元测试时总是想知道:我要测试的实际单元是什么?它应该是明确定义的,充其量是一个纯函数。CoreFunctions这个名字暗示了一个 utils 库,它很可能已经在范围内被夸大了。