yx_speech_to_text_flutter/test/mocks/mock_speech_service.dart

156 lines
4.1 KiB
Dart

import 'dart:async';
import 'package:yx_asr/yx_asr.dart';
/// 模拟语音识别服务,用于测试
class MockSpeechService implements SpeechRecognitionService {
bool _isListening = false;
bool _isAvailable = true;
bool _hasPermission = true;
bool _initializeResult = true;
// 流控制器
final StreamController<SpeechRecognitionResult> _resultController =
StreamController<SpeechRecognitionResult>.broadcast();
final StreamController<SpeechRecognitionError> _errorController =
StreamController<SpeechRecognitionError>.broadcast();
final StreamController<bool> _statusController =
StreamController<bool>.broadcast();
// 配置模拟行为
void setAvailable(bool available) => _isAvailable = available;
void setHasPermission(bool hasPermission) => _hasPermission = hasPermission;
void setInitializeResult(bool result) => _initializeResult = result;
// 模拟发送结果
void mockResult(String text, {double confidence = 1.0}) {
_resultController.add(SpeechRecognitionResult(
recognizedWords: text,
));
}
// 模拟发送错误
void mockError(SpeechRecognitionErrorType type, String message) {
_errorController.add(SpeechRecognitionError(
errorType: type,
errorMsg: message,
errorCode: null,
));
}
// 模拟状态变化
void mockStatusChange(bool isListening) {
_isListening = isListening;
_statusController.add(isListening);
}
@override
Future<bool> isAvailable() async => _isAvailable;
@override
Future<bool> hasPermission() async => _hasPermission;
@override
Future<bool> requestPermission() async => _hasPermission;
@override
Future<bool> initialize(Map<String, dynamic> config) async {
await Future.delayed(const Duration(milliseconds: 100)); // 模拟异步操作
return _initializeResult;
}
@override
Future<void> startListening({bool partialResults = true}) async {
if (!_isListening) {
_isListening = true;
_statusController.add(true);
}
}
@override
Future<void> stopListening() async {
if (_isListening) {
_isListening = false;
_statusController.add(false);
}
}
@override
Future<void> cancel() async {
_isListening = false;
_statusController.add(false);
}
@override
bool get isListening => _isListening;
@override
Stream<SpeechRecognitionResult> get onResult => _resultController.stream;
@override
Stream<SpeechRecognitionError> get onError => _errorController.stream;
@override
Stream<bool> get onListeningStatusChanged => _statusController.stream;
@override
Future<void> dispose() async {
await _resultController.close();
await _errorController.close();
await _statusController.close();
}
}
/// 模拟失败的语音识别服务
class FailingSpeechService implements SpeechRecognitionService {
final StreamController<SpeechRecognitionResult> _resultController =
StreamController<SpeechRecognitionResult>.broadcast();
final StreamController<SpeechRecognitionError> _errorController =
StreamController<SpeechRecognitionError>.broadcast();
final StreamController<bool> _statusController =
StreamController<bool>.broadcast();
@override
Future<bool> isAvailable() async => false;
@override
Future<bool> hasPermission() async => false;
@override
Future<bool> requestPermission() async => false;
@override
Future<bool> initialize(Map<String, dynamic> config) async => false;
@override
Future<void> startListening({bool partialResults = true}) async {
throw Exception('模拟启动失败');
}
@override
Future<void> stopListening() async {
throw Exception('模拟停止失败');
}
@override
Future<void> cancel() async {}
@override
bool get isListening => false;
@override
Stream<SpeechRecognitionResult> get onResult => _resultController.stream;
@override
Stream<SpeechRecognitionError> get onError => _errorController.stream;
@override
Stream<bool> get onListeningStatusChanged => _statusController.stream;
@override
Future<void> dispose() async {
await _resultController.close();
await _errorController.close();
await _statusController.close();
}
}