Flutter PACT协议消费插件dart_pact_consumer的使用

Flutter PACT协议消费插件dart_pact_consumer的使用

Dart库用于构建PACT合约,测试并将其发布到一个代理。

生命周期

设置基础设施

设置定义和测试的支持结构。

final repository = PactRepository();
final serverFactory = await MockServerFactory.create();

模拟服务器

模拟服务器需要加载外部库,该库由PACT团队维护。此包使用默认设置来加载此类库,但需要预先下载。

要使用默认设置运行 dart run dart_pact_consumer:github_download

定义每个交互

final pactBuilder = PactBuilder()
    ..consumer = 'consumer'
    ..provider = 'provider';

final interactionTester = pactBuilder.addState((state) {
    state.state = 'Given empty pet list';
    state.addRequest((request) {
      request
        ..method = Method.POST
        ..headers = { 'accept': 'application/json' }
        ..path = '/pets'
        ..description = 'Post a pet'
        ..body = Body.json(Json.object({'name': 'Bob'}))
        ..setResponse((response) {
          response
            ..status = Status.created
            ..body = Body.isNullOrAbsent();
        });
    });
});

在这个包中,状态处理方式与规范不同。这是有意为之,以简化PACT文件并使其更容易理解。

要发出请求,需要告知提供者应处于哪种状态,因此消除了任何默认隐式状态和来自其他请求的遗留状态。

在模拟服务器上匹配交互

使用模拟服务器确保交互正常,并将它们添加到存储库中。

注意:测试交互不是强制性的,因为此版本的Dart FFI不稳定。如果存在模拟库集成问题,我们仍然可以生成有效的PACT文件。

await interactionTester.test(
  serverFactory,
  (server) => server.invoke('/pets', method: 'POST', status: 201, body: '''{"name":"Bob"}'''),
); 

repository.add(pactBuilder);

server.invoke 的结果是服务器返回的响应,因此可以在此处进行额外验证。

将交互作为PACT合约发布到代理

teardownAll(() {
  serverFactory.close();
  repository.publish(PactHost('broker uri'), 'pact version');
});

更多关于Flutter PACT协议消费插件dart_pact_consumer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter PACT协议消费插件dart_pact_consumer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用dart_pact_consumer插件来创建和验证PACT协议的示例代码。这个示例假设你已经有一个Flutter项目,并且已经添加了dart_pact_consumer依赖。

首先,确保在你的pubspec.yaml文件中添加dart_pact_consumer依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_pact_consumer: ^最新版本号  # 替换为当前最新版本号

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

接下来,我们将编写一些代码来创建一个PACT,模拟一个服务消费者与一个服务提供者之间的交互。

1. 设置PACT Broker(可选)

如果你使用PACT Broker来存储和管理PACT,你需要设置它的URL。这个步骤是可选的,如果你只是本地测试,可以跳过。

import 'package:dart_pact_consumer/dart_pact_consumer.dart';

void setupPactBroker() {
  PactBrokerClient.configure(
    brokerUrl: Uri.parse('https://your-pact-broker-url'),
    authentication: BasicAuth(username: 'your-username', password: 'your-password'),
  );
}

2. 创建PACT并定义交互

下面是一个完整的例子,展示了如何创建一个PACT,定义一个GET请求的期望响应,并验证它。

import 'package:dart_pact_consumer/dart_pact_consumer.dart';
import 'package:test/test.dart';
import 'dart:convert';

void main() {
  late PactClient pactClient;
  late Pact pact;

  setUp(() async {
    // 初始化PACT客户端
    pactClient = PactClient(
      consumer: 'ConsumerName',
      provider: 'ProviderName',
      port: 12345,  // 本地运行的端口
    );

    // 启动PACT服务
    await pactClient.startServer();

    // 创建PACT
    pact = await pactClient.initializePact();
  });

  tearDown(() async {
    // 停止PACT服务
    await pactClient.finalizePact();
    await pactClient.stopServer();
  });

  test('should return a user', () async {
    // 定义期望的交互
    await pact.given('a user exists with id 123')
        .uponReceiving('a GET request to retrieve a user')
        .withRequest(method: 'GET', path: '/users/123')
        .willRespondWith(
          status: 200,
          headers: {'Content-Type': 'application/json'},
          body: jsonEncode({
            'id': 123,
            'name': 'John Doe',
          }),
        );

    // 这里你应该调用你的消费者代码来发起请求到PACT模拟的服务
    // 例如:
    // var response = await http.get(Uri.parse('http://localhost:12345/users/123'));
    // expect(response.statusCode, 200);
    // expect(jsonDecode(response.body), {
    //   'id': 123,
    //   'name': 'John Doe',
    // });

    // 由于这是一个示例,我们直接验证PACT
    await pact.verify();
  });
}

3. 运行测试

使用flutter test命令来运行你的测试。这个命令会启动PACT服务,运行你定义的测试,并验证期望的交互是否匹配。

flutter test

注意事项

  1. 实际请求:在示例代码中,我注释掉了实际的HTTP请求部分。在实际使用中,你需要取消注释并替换为你的消费者代码,确保它发起请求到PACT模拟的服务(通常是http://localhost:你指定的端口/路径)。

  2. PACT Broker:如果你使用PACT Broker,记得在测试完成后发布PACT。这通常是通过CI/CD管道完成的,但你也可以在本地手动发布。

  3. 依赖管理:确保你的Flutter项目依赖是最新的,特别是dart_pact_consumer插件,因为API可能会随着版本更新而变化。

通过上述步骤,你应该能够在Flutter项目中成功使用dart_pact_consumer插件来创建和验证PACT协议。

回到顶部