'test_id', 'access_key_secret' => 'test_secret', 'endpoint' => 'ocr.cn-shanghai.aliyuncs.com', ]; // Create a mock of the OcrApi $mockClient = Mockery::mock(Ocrapi::class); // Mock the response with EduPaperCut structure $mockData = [ 'page_list' => [ [ 'subject_list' => [ [ 'ids' => ['1'], 'text' => '1. 三角形按角分类可以分为( )', 'prism_wordsInfo' => [ ['word' => '1.', 'prob' => 99], ['word' => '三角形', 'prob' => 99], ] ] ] ] ] ]; $responseBody = new RecognizeEduPaperOcrResponseBody([ 'Data' => json_encode($mockData), 'requestId' => 'test-request-id', ]); $response = new RecognizeEduPaperOcrResponse([ 'body' => $responseBody, ]); $mockClient->shouldReceive('recognizeEduPaperCutWithOptions') ->once() ->andReturn($response); // Instantiate the driver with the mock client $driver = new AliyunOCRDriver($config, $mockClient); // This will trigger the API call $result = $driver->recognize(base_path('tests/fixtures/test.jpg'), ['cutType' => 'question']); $this->assertIsArray($result); $this->assertArrayHasKey('questions', $result); $this->assertArrayHasKey('cut_type', $result); $this->assertEquals('question', $result['cut_type']); $this->assertCount(1, $result['questions']); $this->assertEquals('1', $result['questions'][0]['question_number']); $this->assertStringContainsString('三角形', $result['questions'][0]['content']); } }