Flutter模拟后端服务插件mocked_backend的使用
Flutter模拟后端服务插件mocked_backend的使用
特性
- 轻松模拟后端响应
- 使用请求匹配器确认端点实现的完整性
- 将多个请求链入一个“场景”
入门指南
添加依赖项
在 pubspec.yaml
文件中添加 mocked_backend
插件作为开发依赖项:
dev_dependencies:
mocked_backend: <最新版本>
最新版本可以在 pub.dev 的版本标签页找到。
确保它被添加为 dev_dependencies
。
设置Dio拦截器
创建一个 MockedBackendInterceptor
实例,并将其添加到Dio的拦截器中:
MockedBackendInterceptor mockedBackendInterceptor = MockedBackendInterceptor();
final dio = Dio(BaseOptions(baseUrl: 'https://api.deezer.com'));
dio.interceptors.add(mockedBackendInterceptor);
- 对于单元测试,保持对上述拦截器的引用以便在测试中使用。
- 对于BDD测试,可以将拦截器注册到你选择的DI框架中,然后在需要时通过“get_it”获取。
模拟端点
要模拟一个端点,创建一个 MockedRequestHandler
:
MockedRequestHandler(
requestMatcher: RequestMatcherFactory.path('/your-endpoint-path'),
isSuccess: true,
)
创建 MockedRequestHandler
需要两个参数:
requestMatcher
- 告诉拦截器如何检测所需的端点。isSuccess
- 告诉拦截器如何处理匹配的端点。要么成功,要么失败(布尔值)。
还有一些可选参数可以使用:
body
- 可用于模拟后端应返回的JSON响应(无论是成功还是错误响应)。statusCode
- 如果你想将错误代码映射到自定义异常,则可以使用。它也可以用于成功的响应,例如201,如果业务逻辑需要的话。
请求匹配器
有多种请求匹配器可以用来匹配一个端点:
RequestMatcherFactory.path(String path)
- 如果请求路径包含给定路径,则会匹配该请求。RequestMatcherFactory.method(String method)
- 根据请求的方法(GET、POST、PUT等)来匹配请求。最好与路径匹配器结合使用。否则,第一个具有相同方法的端点将被匹配,可能会导致测试失败。RequestMatcherFactory.body(String body)
- 匹配具有给定正文的请求。RequestMatcherFactory.query(Map<String, String> queryParameters)
- 匹配包含给定查询参数的请求。RequestMatcherFactory.multiple(List<RequestMatcher> matchers)
- 组合多个匹配器。
以下是一个示例,展示如何组合多个匹配器:
/// 获取轨道列表:
RequestMatcherFactory.multiple([
RequestMatcherFactory.method('GET'),
RequestMatcherFactory.path('/app/tracks'),
])
/// 更新轨道列表:
RequestMatcherFactory.multiple([
RequestMatcherFactory.method('PUT'),
RequestMatcherFactory.path('/app/tracks'),
])
通过组合以上所有匹配器,你可以确认你使用的端点的方法、路径、查询参数、JSON正文等是否正确。
如果业务逻辑需要调用多个端点,例如登录表单可能需要调用一个端点来验证给定的电子邮件,另一个端点来发送邮件:
final sendEmailSucceedsScenario = Scenario([
MockedRequestHandler(
requestMatcher: RequestMatcherFactory.path('/email/evaluate'),
isSuccess: true,
),
MockedRequestHandler(
requestMatcher: RequestMatcherFactory.path('/email/send'),
isSuccess: true,
),
]);
这两个不同的端点可以轻松地整合到一个场景中。
最后一步是将场景传递给 MockedBackendInterceptor
:
mockedBackendInterceptor.mockScenario(sendEmailSucceedsScenario);
注意事项
如果你的测试调用了未被模拟的端点,将会抛出一个 RequestNotMockedException
异常:
REQUEST NOT MOCKED EXCEPTION
Method: GET
Path: /app/tracks?limit=5
Body: {}
更多关于Flutter模拟后端服务插件mocked_backend的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复