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

我有以下课程:


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何时变为真,另一方面,我希望能够在函数幸运时返回假。


那么你有什么想法可以这样做吗?


ABOUTYOU
浏览 143回答 1
1回答

GCT1015

最轻松的方法是通过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,并且在类的命名空间上,您可以将想要固定和受控行为的方法存根。所以一个简单的经验法则是:在不包括运行 composer require --dev php-mock/php-mock-phpunit在每个测试中,包括\phpmock\phpunit\PHPMock特征找到你的类的命名空间。使用以下方法模拟函数: $functionMock=$this->getFunctionMock(^class_namespace^,^function_name^);   $functionMock->expects(^expected_call_times^)->willReturn(^values^);
打开App,查看更多内容
随时随地看视频慕课网APP