TestMockSubServices.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. namespace App\Traits;
  3. use App\MaterialBox;
  4. use App\Services\MaterialBoxService;
  5. use App\Services\StationTaskCommodityService;
  6. trait TestMockSubServices{
  7. /**
  8. * 例子:
  9. * $this->service=$this->subMock([
  10. * 'class'=>StationTaskCommodityService::class,
  11. * 'subServices'=>[
  12. * [
  13. * 'serviceName'=>'materialBoxService',
  14. * 'class'=>MaterialBoxService::class,
  15. * 'methods'=>[
  16. * 'firstOrCreate'=>new MaterialBox(['id'=>1]),
  17. * ],
  18. * ],
  19. * ]
  20. * ]);
  21. * @param array $serviceDefinition
  22. * @return \PHPUnit\Framework\MockObject\MockObject
  23. */
  24. function subMock(array $serviceDefinition){
  25. $mockingService=$this->createPartialMock(
  26. $serviceDefinition['class'],
  27. isset($serviceDefinition['methods'])
  28. ?array_keys($serviceDefinition['methods']):[]
  29. );
  30. if(isset($serviceDefinition['methods']))
  31. foreach ($serviceDefinition['methods'] as $mName=>$mVal){
  32. $mockingService->method($mName)->willReturn($mVal);
  33. }
  34. if(isset($serviceDefinition['subServices']))
  35. $this->registerSubServices($mockingService,$serviceDefinition['subServices']);
  36. return $mockingService;
  37. }
  38. private function registerSubServices($rootService, $subServices){
  39. foreach ($subServices as $subService){
  40. $rootService->instant(
  41. $subService['serviceName'],
  42. ($subServiceMock=function()use($subService){
  43. $subServiceMock=$this->createPartialMock(
  44. $subService['class'],
  45. array_keys($subService['methods'])
  46. );
  47. if(isset($subService['methods']))
  48. foreach ($subService['methods'] as $methodName=>$methodVal){
  49. $subServiceMock->method($methodName)->willReturn($methodVal);
  50. }
  51. if(isset($subService['subServices'])){
  52. $this->registerSubServices($subServiceMock,$subService['subServices']);
  53. }
  54. return $subServiceMock;
  55. })()
  56. );
  57. }
  58. }
  59. function getTargetFieldCirculately($targetArr, $className='', $idName='id'){
  60. $amount = count($targetArr);
  61. $json_encode = json_encode($targetArr);
  62. $iName = 'i_' . md5($json_encode . $className);
  63. if(!isset($this->data[$iName])){
  64. $this->data[$iName]=$amount;
  65. }
  66. $this->data[$iName]++;
  67. if($this->data[$iName]>=$amount)
  68. $this->data[$iName]=0;
  69. return $targetArr[$this->data[$iName]][$idName];
  70. }
  71. function getIntegerIncreasely($markStr): int
  72. {
  73. $iName = 'i_' . $markStr;
  74. if(!isset($this->data[$iName])){
  75. $this->data[$iName]=-1;
  76. }
  77. $this->data[$iName]++;
  78. return $this->data[$iName];
  79. }
  80. function makeArray($amount,$array)
  81. {
  82. $resultArrays=[];
  83. for($i=0;$i<$amount;$i++){
  84. $newArr=[];
  85. foreach ($array as $key=>$item){
  86. if(gettype($item)=='object'){
  87. $newArr[$key]=$item();
  88. }else{
  89. $newArr[$key]=$item;
  90. }
  91. }
  92. $resultArrays[]= $newArr;
  93. }
  94. return $resultArrays;
  95. }
  96. }