Flutter测试辅助插件shelf_test_handler的使用

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

Flutter测试辅助插件shelf_test_handler的使用

插件介绍

shelf_test_handler 是一个用于简化 HTTP 交互测试的插件,特别适用于在特定顺序中预期多个不同 HTTP 请求的情况。 它提供了一个简单的的 HTTP 服务器来 包裹处理程序,客户端代码可以传递该 URL。

示例代码

import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';

import 'package:my_package/my_package.dart';

void main() {
  test("client performs protocol handshake", () async {
    // 这是一个启动 ShelfTestHandler 的简单服务器的工具类。
    var server = new ShelfTestServer();

    // 断言客户端将对 /token 发起 GET 请求。
    server.handler.expect("GET", "/token", (request) async {
      // 处理 GET /token 请求。
      var body = JSON.parse(await request.readAsString());

      // 在此处理程序中的任何失败都会导致测试失败,因此可以安全地进行断言。
      expect(body, containsPair("id", "my_package_id"));
      expect(body, containsPair("secret", "13abc"));

      return new shelf.Response.ok(JSON.encode({"token": "a1c3"}), headers: {"content-type": "application/json"});
    });

    // 对 `server.url` 发出的请求将由我们声明的处理器处理。
    var myPackage = new MyPackage(server.url);

    // 如果客户端发出任何意外的请求,测试将失败。
    await myPackage.performHandshake();
  });
}

更多关于Flutter测试辅助插件shelf_test_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter测试辅助插件shelf_test_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 shelf_test_handler 插件进行 Flutter 测试的代码示例。shelf_test_handler 通常用于处理 Dart HTTP 服务器(shelf)的请求,以便于在测试中模拟后端服务。

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

dependencies:
  flutter:
    sdk: flutter
  test: ^1.17.10  # 确保你的测试依赖是最新的
dev_dependencies:
  shelf_test_handler: ^0.0.3  # 检查最新版本号并添加

然后运行 flutter pub get 来获取依赖。

接下来,我们编写一个简单的 Flutter 应用,该应用将发送 HTTP 请求到一个模拟的后端服务,并使用 shelf_test_handler 来处理这些请求。

1. 创建一个简单的 Shelf 服务器处理器

创建一个 Dart 文件(例如 mock_server.dart)来设置我们的 mock server:

import 'dart:async';
import 'package:shelf/shelf.dart';
import 'package:shelf_test_handler/shelf_test_handler.dart';

Handler createMockHandler() {
  var requests = <Request>[];

  return (Request request) async {
    requests.add(request);
    // 简单的响应示例
    return Response.ok(body: 'Mock Response');
  };
}

Future<void> main() async {
  var handler = createMockHandler();
  var server = await serve(handler, 'localhost', 0);
  var testHandler = createTestHandler(handler);

  // 打印服务器地址和端口,实际使用中你可能不需要这一步
  print('Mock server running at http://${server.address.host}:${server.port}');

  // 这里你可以运行你的 Flutter 测试,testHandler 将用于测试中
  // 例如,通过环境变量或其他方式将 testHandler 传递给测试代码

  // 保持服务器运行,直到手动停止
  await for (var _ in server) {}
}

注意:在实际测试中,你不会在 main 函数中运行这个服务器。相反,你会在测试代码中直接创建和使用 testHandler

2. 在 Flutter 测试中使用 shelf_test_handler

在你的测试文件中(例如 my_test.dart),你可以这样使用 shelf_test_handler

import 'dart:convert';
import 'package:flutter_test/flutter_test.dart';
import 'package:http/http.dart' as http;
import 'mock_server.dart'; // 导入我们之前创建的 mock server 文件

void main() {
  late ShelfTestHandler testHandler;
  late http.Client client;

  setUpAll(() async {
    var handler = createMockHandler();
    testHandler = createTestHandler(handler);
    client = http.Client();
  });

  tearDownAll(() async {
    await client.close();
  });

  test('should return mock response', () async {
    var response = await client.get(Uri.parse('http://localhost:${testHandler.bindPort}/some-path'));

    expect(response.statusCode, 200);
    expect(response.body, 'Mock Response');

    // 你也可以检查请求日志
    var requests = testHandler.receivedRequests;
    expect(requests.length, 1);
    expect(requests.first.requestedUri.path, '/some-path');
  });
}

在这个测试示例中,我们:

  1. 使用 setUpAll 设置了一个全局的 ShelfTestHandlerhttp.Client
  2. 在测试中发送了一个 HTTP GET 请求到 mock server。
  3. 验证了响应的状态码和响应体。
  4. 检查了 mock server 收到的请求日志。

通过这种方式,你可以在 Flutter 测试中轻松地模拟 HTTP 请求和响应,而无需启动实际的后端服务。

回到顶部