面试题答案
一键面试测试思路
- 模拟网络延迟:使用
Future.delayed
方法来模拟网络延迟。在每个异步操作中,通过Future.delayed
让其等待一定时间,模拟网络请求花费的时间。 - 模拟错误情况:在异步操作中,通过抛出异常来模拟网络错误等异常情况。同时在测试代码中使用
expect
结合throws
来验证异步操作是否按预期抛出异常。
关键代码示例
假设异步操作链如下:
Future<String> fetchData1() async {
// 模拟网络请求
await Future.delayed(const Duration(seconds: 1));
return 'data1';
}
Future<String> fetchData2(String data1) async {
await Future.delayed(const Duration(seconds: 1));
return '$data1 - data2';
}
Future<String> fetchData3(String data2) async {
await Future.delayed(const Duration(seconds: 1));
return '$data2 - data3';
}
测试代码如下:
import 'package:flutter_test/flutter_test.dart';
void main() {
test('Test async operation chain with success', () async {
final data1 = await fetchData1();
final data2 = await fetchData2(data1);
final data3 = await fetchData3(data2);
expect(data3, 'data1 - data2 - data3');
});
test('Test async operation chain with error in fetchData2', () async {
final data1 = await fetchData1();
expect(() => fetchData2(data1), throwsA(isA<Exception>()));
});
}
在上述代码中:
test('Test async operation chain with success', () async {... })
测试了异步操作链成功执行的情况。test('Test async operation chain with error in fetchData2', () async {... })
测试了fetchData2
抛出异常的情况,验证整个异步操作链对错误的处理。通过expect(() => fetchData2(data1), throwsA(isA<Exception>()))
来验证fetchData2
会抛出异常。如果要模拟具体的异常,可以将Exception
替换为具体的异常类型。同时,为了模拟网络延迟,在fetchData1
、fetchData2
和fetchData3
方法中都使用了Future.delayed
。