make(Illuminate\Contracts\Console\Kernel::class); $kernel->bootstrap(); echo "=== 物品消耗冻结功能测试 ===\n"; $testUserId = 99999; $testItemId = 1001; try { // 清理测试数据 DB::transaction(function () use ($testUserId, $testItemId) { ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete(); // 创建测试数据 echo "创建测试数据...\n"; // 添加100个未冻结物品 ItemUser::create([ 'user_id' => $testUserId, 'item_id' => $testItemId, 'instance_id' => null, 'quantity' => 100, 'is_frozen' => false, 'frozen_log_id' => null, ]); // 添加50个冻结物品 ItemUser::create([ 'user_id' => $testUserId, 'item_id' => $testItemId, 'instance_id' => null, 'quantity' => 50, 'is_frozen' => true, 'frozen_log_id' => 999, // 假设的冻结日志ID ]); echo "测试数据创建完成:100个未冻结 + 50个冻结 = 150个总数\n\n"; }); // 测试1:不包含冻结物品的消耗(默认行为) echo "=== 测试1:不包含冻结物品的消耗 ===\n"; DB::transaction(function () use ($testUserId, $testItemId) { $result = ItemService::consumeItem( $testUserId, $testItemId, null, 80, ['source_type' => 'test', 'source_id' => 1] ); if ($result['success']) { echo "✓ 消耗80个物品成功\n"; // 检查剩余数量 $items = ItemUser::where('user_id', $testUserId) ->where('item_id', $testItemId) ->get(); $unfrozenQuantity = $items->where('is_frozen', false)->sum('quantity'); $frozenQuantity = $items->where('is_frozen', true)->sum('quantity'); echo "剩余未冻结物品:{$unfrozenQuantity}个(期望:20个)\n"; echo "剩余冻结物品:{$frozenQuantity}个(期望:50个)\n"; if ($unfrozenQuantity == 20 && $frozenQuantity == 50) { echo "✓ 测试1通过\n\n"; } else { echo "✗ 测试1失败\n\n"; } } else { echo "✗ 消耗失败:" . ($result['message'] ?? '未知错误') . "\n\n"; } }); // 重置测试数据 DB::transaction(function () use ($testUserId, $testItemId) { ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete(); ItemUser::create([ 'user_id' => $testUserId, 'item_id' => $testItemId, 'instance_id' => null, 'quantity' => 100, 'is_frozen' => false, 'frozen_log_id' => null, ]); ItemUser::create([ 'user_id' => $testUserId, 'item_id' => $testItemId, 'instance_id' => null, 'quantity' => 50, 'is_frozen' => true, 'frozen_log_id' => 999, ]); }); // 测试2:包含冻结物品的消耗 echo "=== 测试2:包含冻结物品的消耗 ===\n"; DB::transaction(function () use ($testUserId, $testItemId) { $result = ItemService::consumeItem( $testUserId, $testItemId, null, 120, [ 'source_type' => 'test', 'source_id' => 1, 'include_frozen' => true // 包含冻结物品 ] ); if ($result['success']) { echo "✓ 消耗120个物品成功(包含冻结物品)\n"; // 检查剩余数量 $totalQuantity = ItemUser::where('user_id', $testUserId) ->where('item_id', $testItemId) ->sum('quantity'); echo "剩余总数量:{$totalQuantity}个(期望:30个)\n"; if ($totalQuantity == 30) { echo "✓ 测试2通过\n\n"; } else { echo "✗ 测试2失败\n\n"; } } else { echo "✗ 消耗失败:" . ($result['message'] ?? '未知错误') . "\n\n"; } }); // 测试3:不包含冻结物品时数量不足 echo "=== 测试3:不包含冻结物品时数量不足 ===\n"; DB::transaction(function () use ($testUserId, $testItemId) { // 重置为只有100个未冻结物品 ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete(); ItemUser::create([ 'user_id' => $testUserId, 'item_id' => $testItemId, 'instance_id' => null, 'quantity' => 100, 'is_frozen' => false, 'frozen_log_id' => null, ]); ItemUser::create([ 'user_id' => $testUserId, 'item_id' => $testItemId, 'instance_id' => null, 'quantity' => 50, 'is_frozen' => true, 'frozen_log_id' => 999, ]); try { $result = ItemService::consumeItem( $testUserId, $testItemId, null, 120, // 尝试消耗120个,但只有100个未冻结 ['source_type' => 'test', 'source_id' => 1] ); echo "✗ 测试3失败:应该抛出异常但没有\n\n"; } catch (Exception $e) { if (strpos($e->getMessage(), '数量不足') !== false) { echo "✓ 测试3通过:正确抛出数量不足异常\n"; echo "异常信息:" . $e->getMessage() . "\n\n"; } else { echo "✗ 测试3失败:异常信息不正确\n"; echo "异常信息:" . $e->getMessage() . "\n\n"; } } }); // 清理测试数据 DB::transaction(function () use ($testUserId, $testItemId) { ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete(); echo "测试数据清理完成\n"; }); echo "=== 所有测试完成 ===\n"; } catch (Exception $e) { echo "测试过程中发生错误:" . $e->getMessage() . "\n"; echo "堆栈跟踪:\n" . $e->getTraceAsString() . "\n"; }