Flutter模拟后端服务插件mocked_backend的使用

发布于 1周前 作者 itying888 来自 Flutter

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 需要两个参数:

  1. requestMatcher - 告诉拦截器如何检测所需的端点。
  2. isSuccess - 告诉拦截器如何处理匹配的端点。要么成功,要么失败(布尔值)。

还有一些可选参数可以使用:

  1. body - 可用于模拟后端应返回的JSON响应(无论是成功还是错误响应)。
  2. statusCode - 如果你想将错误代码映射到自定义异常,则可以使用。它也可以用于成功的响应,例如201,如果业务逻辑需要的话。

请求匹配器

有多种请求匹配器可以用来匹配一个端点:

  1. RequestMatcherFactory.path(String path) - 如果请求路径包含给定路径,则会匹配该请求。
  2. RequestMatcherFactory.method(String method) - 根据请求的方法(GET、POST、PUT等)来匹配请求。最好与路径匹配器结合使用。否则,第一个具有相同方法的端点将被匹配,可能会导致测试失败。
  3. RequestMatcherFactory.body(String body) - 匹配具有给定正文的请求。
  4. RequestMatcherFactory.query(Map<String, String> queryParameters) - 匹配包含给定查询参数的请求。
  5. 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 回复

更多关于Flutter模拟后端服务插件mocked_backend的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用mocked_backend插件来模拟后端服务的示例代码。mocked_backend是一个方便的工具,用于在开发过程中模拟后端API响应,而无需实际连接到后端服务器。

首先,确保你已经在pubspec.yaml文件中添加了mocked_backend依赖:

dependencies:
  flutter:
    sdk: flutter
  mocked_backend: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

接下来,我们创建一个简单的Flutter应用,并配置mocked_backend来模拟API请求。

1. 设置MockedBackend

在你的Flutter项目中,创建一个新的Dart文件,比如mock_server.dart,用于配置MockedBackend:

import 'package:mocked_backend/mocked_backend.dart';
import 'package:http/http.dart' as http;

class MockServer {
  MockServer._();

  static final MockServer _instance = MockServer._();

  factory MockServer() => _instance;

  MockedBackend? _mockedBackend;

  void setupMocks() {
    _mockedBackend = MockedBackend();

    // 模拟一个简单的GET请求
    _mockedBackend!.when(
      http.Request('GET', Uri.parse('https://api.example.com/data')),
    ).thenRespond(
      http.Response(
        jsonEncode({
          'message': 'Hello from mocked backend!',
          'data': [1, 2, 3, 4, 5],
        }),
        200,
      ),
    );

    // 模拟一个POST请求
    _mockedBackend!.when(
      http.Request('POST', Uri.parse('https://api.example.com/submit')),
    ).thenRespond(
      http.Response(
        jsonEncode({
          'success': true,
          'message': 'Data submitted successfully!',
        }),
        201,
      ),
    );
  }

  http.Client get client => _mockedBackend!.client;
}

2. 使用MockServer

在你的主应用文件(比如main.dart)中,使用配置好的MockServer来发送请求:

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'mock_server.dart';

void main() {
  MockServer().setupMocks();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? responseData;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Mocked Backend Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: _fetchData,
                child: Text('Fetch Data'),
              ),
              SizedBox(height: 20),
              if (responseData != null)
                Text(
                  responseData!,
                  style: TextStyle(fontSize: 18),
                ),
            ],
          ),
        ),
      ),
    );
  }

  void _fetchData() async {
    final client = MockServer().client;
    final response = await client.get(Uri.parse('https://api.example.com/data'));

    if (response.statusCode == 200) {
      setState(() {
        responseData = jsonDecode(response.body)['message'];
      });
    } else {
      setState(() {
        responseData = 'Failed to fetch data';
      });
    }
  }
}

3. 运行应用

现在你可以运行你的Flutter应用,点击“Fetch Data”按钮,应该会看到从模拟后端返回的消息。

这个示例展示了如何使用mocked_backend插件来模拟GET请求。你可以根据需要扩展这个示例,模拟更多的HTTP方法和复杂的响应。通过这种方式,你可以在开发过程中避免依赖实际的后端服务,从而加快开发速度和提高开发效率。

回到顶部