Laravel中如何测试Base64图片上传?解决大Base64串问题
解决Saloon测试中Base64图片字符串过长的问题
方案1:将Base64字符串存到单独文件,测试时读取
把Base64内容保存到项目的测试资源目录(比如tests/resources/test_image.base64),测试代码里直接读取文件内容,彻底避免超长字符串硬编码在代码里。
代码示例:
// 从文件读取Base64字符串 $base64Image = file_get_contents(base_path('tests/resources/test_image.base64')); $attributes = ["token_image" => $base64Image]; json("POST", "/route", $attributes) ->assertOk() ->assertJson($response);
方案2:用极简占位Base64+调整Mock匹配规则
如果Mock录制后只需要验证接口逻辑,不需要真实图片内容,可以用一个极小的Base64图片(比如1x1透明像素),同时配置Saloon的Mock匹配器,忽略token_image字段的具体值,确保不同Base64内容都能匹配到录制的响应。
极简1x1透明PNG的Base64示例:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=
Saloon v3的匹配规则配置示例:
// 配置Mock的自定义匹配逻辑 $this->mockClient->addResponse($recordedResponse, function (Request $request) { // 先验证请求方法和路由是否匹配 if ($request->getMethod() !== 'POST' || $request->getUri()->getPath() !== '/route') { return false; } // 移除token_image字段,只验证其他需要匹配的请求参数 $requestData = $request->body()->all(); unset($requestData['token_image']); // 这里填你需要验证的其他请求字段(如果有的话) $expectedOtherFields = []; return $requestData === $expectedOtherFields; }); // 测试时直接用极简Base64 $attributes = ["token_image" => "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="]; json("POST", "/route", $attributes) ->assertOk() ->assertJson($response);
方案3:录制Mock时用占位符,测试时复用
录制Mock响应阶段,直接用一个简短的占位符代替真实Base64,测试时统一用该占位符发起请求,确保和录制的请求参数完全匹配,就能复用Mock响应。
录制阶段代码:
// 用简短占位符代替真实Base64 $attributes = ["token_image" => "TEST_IMAGE_PLACEHOLDER"]; // 执行请求并录制响应 $response = json("POST", "/route", $attributes)->send(); $this->mockClient->recordResponse($response);
测试阶段代码:
// 直接复用录制时的占位符 $attributes = ["token_image" => "TEST_IMAGE_PLACEHOLDER"]; json("POST", "/route", $attributes) ->assertOk() ->assertJson($response);
内容的提问来源于stack exchange,提问作者DeveloperX
相关产品推荐
相关产品推荐

