PetSkillLastDataTest.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <?php
  2. namespace Tests\Feature;
  3. use Tests\TestCase;
  4. use Illuminate\Foundation\Testing\RefreshDatabase;
  5. use Illuminate\Support\Facades\Cache;
  6. use Illuminate\Support\Facades\Event;
  7. use App\Module\Pet\Events\PetSkillUsedEvent;
  8. use App\Module\Game\Listeners\PetSkillUsedListener;
  9. use App\Module\Game\Logics\PetTemp;
  10. use App\Module\Pet\Services\PetService;
  11. use App\Module\Pet\Dtos\PetDataDto;
  12. use App\Module\Pet\Dtos\PetLifeSkillDto;
  13. use App\Module\Game\Dtos\PetStatusTempDto;
  14. use App\Module\AppGame\Listeners\AppGameProtobufResponseListener;
  15. /**
  16. * 宠物技能使用LastData测试
  17. *
  18. * 测试宠物技能使用后LastData是否正确包含宠物状态数据
  19. */
  20. class PetSkillLastDataTest extends TestCase
  21. {
  22. use RefreshDatabase;
  23. protected function setUp(): void
  24. {
  25. parent::setUp();
  26. // 清理缓存
  27. Cache::flush();
  28. }
  29. /**
  30. * 测试宠物技能使用事件监听器
  31. */
  32. public function test_pet_skill_used_event_listener()
  33. {
  34. // 创建测试用的宠物数据DTO
  35. $petDataDto = new PetDataDto();
  36. $petDataDto->id = 1;
  37. $petDataDto->typeId = 1;
  38. $petDataDto->name = '测试宠物';
  39. $petDataDto->level = 5;
  40. $petDataDto->exp = 100;
  41. $petDataDto->power = 80;
  42. $petDataDto->maxpower = 100;
  43. $petDataDto->score = 150;
  44. $petDataDto->fightingCapacity = 150;
  45. $petDataDto->grade = 2;
  46. $petDataDto->status = 1;
  47. // 创建生活技能数据
  48. $lifeSkill1 = new PetLifeSkillDto();
  49. $lifeSkill1->skillId = 1;
  50. $lifeSkill1->canuse = true;
  51. $lifeSkill1->curnum = 0;
  52. $lifeSkill1->maxnum = 300;
  53. $lifeSkill2 = new PetLifeSkillDto();
  54. $lifeSkill2->skillId = 2;
  55. $lifeSkill2->canuse = false;
  56. $lifeSkill2->curnum = 150;
  57. $lifeSkill2->maxnum = 300;
  58. $petDataDto->lifeSkills = [$lifeSkill1, $lifeSkill2];
  59. // Mock PetService::getPetStatus 方法
  60. $this->mock(PetService::class, function ($mock) use ($petDataDto) {
  61. $mock->shouldReceive('getPetStatus')
  62. ->with(10001, 1)
  63. ->andReturn($petDataDto);
  64. });
  65. // 创建宠物技能使用事件
  66. $event = new PetSkillUsedEvent(10001, 1, 1, []);
  67. // 创建监听器并处理事件
  68. $listener = new PetSkillUsedListener();
  69. $listener->handle($event);
  70. // 验证数据是否正确存储到临时缓存
  71. $petUpdates = PetTemp::getUserPetUpdates(10001);
  72. $this->assertNotEmpty($petUpdates, '宠物更新数据应该不为空');
  73. $this->assertArrayHasKey(1, $petUpdates, '应该包含宠物ID为1的数据');
  74. $petTempDto = $petUpdates[1];
  75. $this->assertInstanceOf(PetStatusTempDto::class, $petTempDto, '应该是PetStatusTempDto实例');
  76. // 验证基本属性
  77. $this->assertEquals(1, $petTempDto->id);
  78. $this->assertEquals('测试宠物', $petTempDto->name);
  79. $this->assertEquals(5, $petTempDto->level);
  80. $this->assertEquals(80, $petTempDto->power);
  81. // 验证生活技能数据
  82. $this->assertIsArray($petTempDto->lifeSkills, 'lifeSkills应该是数组');
  83. $this->assertCount(2, $petTempDto->lifeSkills, '应该有2个生活技能');
  84. // 验证第一个技能
  85. $skill1 = $petTempDto->lifeSkills[0];
  86. $this->assertInstanceOf(PetLifeSkillDto::class, $skill1, '技能应该是PetLifeSkillDto实例');
  87. $this->assertEquals(1, $skill1->skillId);
  88. $this->assertTrue($skill1->canuse);
  89. $this->assertEquals(0, $skill1->curnum);
  90. $this->assertEquals(300, $skill1->maxnum);
  91. // 验证第二个技能
  92. $skill2 = $petTempDto->lifeSkills[1];
  93. $this->assertInstanceOf(PetLifeSkillDto::class, $skill2, '技能应该是PetLifeSkillDto实例');
  94. $this->assertEquals(2, $skill2->skillId);
  95. $this->assertFalse($skill2->canuse);
  96. $this->assertEquals(150, $skill2->curnum);
  97. $this->assertEquals(300, $skill2->maxnum);
  98. }
  99. /**
  100. * 测试从缓存恢复数据时lifeSkills的正确性
  101. */
  102. public function test_pet_status_temp_dto_from_cache()
  103. {
  104. // 模拟缓存中的数据(数组格式)
  105. $cachedData = [
  106. 1 => [
  107. 'id' => 1,
  108. 'type_id' => 1,
  109. 'name' => '测试宠物',
  110. 'level' => 5,
  111. 'exp' => 100,
  112. 'power' => 80,
  113. 'maxpower' => 100,
  114. 'score' => 150,
  115. 'fighting_capacity' => 150,
  116. 'grade' => 2,
  117. 'status' => 1,
  118. 'life_skills' => [
  119. [
  120. 'skill_id' => 1,
  121. 'canuse' => true,
  122. 'curnum' => 0,
  123. 'maxnum' => 300
  124. ],
  125. [
  126. 'skill_id' => 2,
  127. 'canuse' => false,
  128. 'curnum' => 150,
  129. 'maxnum' => 300
  130. ]
  131. ],
  132. 'updated_at' => time()
  133. ]
  134. ];
  135. // 使用fromCache方法恢复数据
  136. $result = PetStatusTempDto::fromCache($cachedData);
  137. $this->assertNotEmpty($result, '恢复的数据应该不为空');
  138. $this->assertArrayHasKey(1, $result, '应该包含宠物ID为1的数据');
  139. $petDto = $result[1];
  140. $this->assertInstanceOf(PetStatusTempDto::class, $petDto, '应该是PetStatusTempDto实例');
  141. // 验证基本属性
  142. $this->assertEquals(1, $petDto->id);
  143. $this->assertEquals('测试宠物', $petDto->name);
  144. $this->assertEquals(5, $petDto->level);
  145. $this->assertEquals(80, $petDto->power);
  146. // 验证生活技能数据
  147. $this->assertIsArray($petDto->lifeSkills, 'lifeSkills应该是数组');
  148. $this->assertCount(2, $petDto->lifeSkills, '应该有2个生活技能');
  149. // 验证第一个技能
  150. $skill1 = $petDto->lifeSkills[0];
  151. $this->assertInstanceOf(PetLifeSkillDto::class, $skill1, '技能应该是PetLifeSkillDto实例');
  152. $this->assertEquals(1, $skill1->skillId);
  153. $this->assertTrue($skill1->canuse);
  154. $this->assertEquals(0, $skill1->curnum);
  155. $this->assertEquals(300, $skill1->maxnum);
  156. // 验证第二个技能
  157. $skill2 = $petDto->lifeSkills[1];
  158. $this->assertInstanceOf(PetLifeSkillDto::class, $skill2, '技能应该是PetLifeSkillDto实例');
  159. $this->assertEquals(2, $skill2->skillId);
  160. $this->assertFalse($skill2->canuse);
  161. $this->assertEquals(150, $skill2->curnum);
  162. $this->assertEquals(300, $skill2->maxnum);
  163. }
  164. /**
  165. * 测试AppGameProtobufResponseListener处理宠物数据时不会出错
  166. */
  167. public function test_app_game_protobuf_response_listener_handles_pet_data()
  168. {
  169. // 创建测试用的宠物数据并存储到临时缓存
  170. $petTempDto = new PetStatusTempDto();
  171. $petTempDto->id = 1;
  172. $petTempDto->typeId = 1;
  173. $petTempDto->name = '测试宠物';
  174. $petTempDto->level = 5;
  175. $petTempDto->exp = 100;
  176. $petTempDto->power = 80;
  177. $petTempDto->maxpower = 100;
  178. $petTempDto->score = 150;
  179. $petTempDto->fightingCapacity = 150;
  180. $petTempDto->grade = 2;
  181. $petTempDto->status = 1;
  182. // 创建生活技能数据
  183. $lifeSkill1 = new PetLifeSkillDto();
  184. $lifeSkill1->skillId = 1;
  185. $lifeSkill1->canuse = true;
  186. $lifeSkill1->curnum = 0;
  187. $lifeSkill1->maxnum = 300;
  188. $lifeSkill2 = new PetLifeSkillDto();
  189. $lifeSkill2->skillId = 2;
  190. $lifeSkill2->canuse = false;
  191. $lifeSkill2->curnum = 150;
  192. $lifeSkill2->maxnum = 300;
  193. $petTempDto->lifeSkills = [$lifeSkill1, $lifeSkill2];
  194. $petTempDto->updatedAt = time();
  195. // 手动存储到缓存
  196. $tempKey = 'pet_temp_update_10001';
  197. Cache::put($tempKey, [1 => $petTempDto], 3600);
  198. // 获取数据并验证
  199. $petUpdates = PetTemp::getUserPetUpdates(10001);
  200. $this->assertNotEmpty($petUpdates, '宠物更新数据应该不为空');
  201. $this->assertArrayHasKey(1, $petUpdates, '应该包含宠物ID为1的数据');
  202. $retrievedPet = $petUpdates[1];
  203. $this->assertInstanceOf(PetStatusTempDto::class, $retrievedPet, '应该是PetStatusTempDto实例');
  204. // 验证生活技能数据类型正确
  205. $this->assertIsArray($retrievedPet->lifeSkills, 'lifeSkills应该是数组');
  206. $this->assertCount(2, $retrievedPet->lifeSkills, '应该有2个生活技能');
  207. foreach ($retrievedPet->lifeSkills as $skill) {
  208. $this->assertInstanceOf(PetLifeSkillDto::class, $skill, '每个技能都应该是PetLifeSkillDto实例');
  209. $this->assertObjectHasProperty('skillId', $skill, '技能应该有skillId属性');
  210. $this->assertObjectHasProperty('canuse', $skill, '技能应该有canuse属性');
  211. $this->assertObjectHasProperty('curnum', $skill, '技能应该有curnum属性');
  212. $this->assertObjectHasProperty('maxnum', $skill, '技能应该有maxnum属性');
  213. }
  214. }
  215. }