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

模拟不存在于任何类中的函数的调用(例如 php 标准函数)以具有固定行为

模拟不存在于任何类中的函数的调用(例如 php 标准函数)以具有固定行为

PHP
ABOUTYOU 2021-09-18 21:19:53
我有以下课程:namespace Utils\Random;class RandomHelper{      const LUCKY_NUMBER=3;   public static function lucky()   {      return rand(0,6)==self::LUCKY_NUMBER;   }    }我想使用单元测试来测试这个类:namespace Tests\Random;use PHPUnit\Framework\TestCase;class RandomHelperTest extends TestCase{   public function testLucky()   {     // Mock rand here     //  Here I want the rand return a value that is not 3   }   public function testLuckyFails()   {      // Mock rand here     //  Here I want the rand return a value that is not 3   }}但是为了让我的测试成为单元测试,我想模拟 php 标准函数rand,以便能够在我的测试中获得恒定的结果。正如您所看到的,我的需求存在冲突,因此该解决方案似乎不适合我。在一个测试中,我想检查该方法lucky何时变为真,另一方面,我希望能够在函数幸运时返回假。那么你有什么想法可以这样做吗?
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

最轻松的方法是通过php-mock/php-mock-phpunit包。


在您的情况下,正确的用法是:


namespace Tests\Random;


use PHPUnit\Framework\TestCase;

use Utils\Random\RandomHelper;


class RandomHelperTest extends TestCase

{


   use \phpmock\phpunit\PHPMock;


   public function testLucky()

   {

      $rand=$this->getFunctionMock('Utils\Random', "rand");

      $rand->expects($this->once())->willReturn(RandomHelper::LUCKY_NUMBER);


      $boolean=RandomHelper::lucky();


      $this->assertTrue($boolean);

   }


   public function testLuckyFails()

   {


      $rand=$this->getFunctionMock('Utils\Random', "rand");

      $rand->expects($this->once())->willReturn(0);


      $boolean=RandomHelper::lucky();


      $this->assertFalse($boolean);

   }

}

正如您所看到的,您可以使用@Anton Mitsev 所说的 php-mock,并且在类的命名空间上,您可以将想要固定和受控行为的方法存根。

所以一个简单的经验法则是:

  1. 在不包括运行 composer require --dev php-mock/php-mock-phpunit

  2. 在每个测试中,包括\phpmock\phpunit\PHPMock特征

  3. 找到你的类的命名空间。

  4. 使用以下方法模拟函数:

 $functionMock=$this->getFunctionMock(^class_namespace^,^function_name^); 
 $functionMock->expects(^expected_call_times^)->willReturn(^values^);


查看完整回答
反对 回复 2021-09-18
  • 1 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信