0%

在PHP单元测试中Mock time 以及 date 等预置函数

背景

在单元测试时,有时候会碰到代码中使用了 timedate 等函数,然后根据这些函数的返回执行不同的分支。

这种情况下想要覆盖到所有分支,可以通过在相同命名空间下定义同名函数,来达到mock的目的

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 待测代码
namespace foo;

if (time() >= strtotime('2019-01-01')) {
...
} else {
...
}

// 单元测试
namespace foo;

function time() {
return strtotime('2018-01-01');
}

参考 https://stackoverflow.com/a/5337635