如何测试调用rand()函数的PHP方法?
解决PHP中调用rand()方法的单元测试问题
针对你遇到的问题,不用模拟整个类,用Phockito的**部分mock(partial mock)**就可以只控制rand()的返回值,同时保留类其他方法的原有逻辑。下面是具体方案:
方案1:重构原类,封装rand()依赖
先把全局的rand()调用封装成类的一个受保护方法,这样就能单独mock这个方法:
原类代码修改:
class MyClass { public function myFunction() { return hash( 'sha256', 'this is some random string: ' . $this->getRandomNumber() ); } // 封装rand(),方便测试时mock protected function getRandomNumber() { return rand(); } }
方案2:编写单元测试
用Phockito的partialMock创建类的部分模拟对象,只mockgetRandomNumber方法返回固定值,这样就能计算出确定的预期哈希值:
测试代码:
public function testFunction() { // 创建部分mock实例,保留原类的其他方法实现 $myClass = Phockito::partialMock(MyClass::class); // 指定getRandomNumber返回固定值12345 Phockito::when($myClass)->getRandomNumber()->thenReturn(12345); $result = $myClass->myFunction(); // 计算对应的预期哈希值 $expected = hash('sha256', 'this is some random string: 12345'); $this->assertEquals($expected, $result); }
这样既不用模拟整个类的所有方法,又能精准控制随机数的返回值,让测试结果可预期。
内容的提问来源于stack exchange,提问作者physicsboy
相关产品推荐
相关产品推荐

