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
更多关于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
注意事项
-
实际请求:在示例代码中,我注释掉了实际的HTTP请求部分。在实际使用中,你需要取消注释并替换为你的消费者代码,确保它发起请求到PACT模拟的服务(通常是
http://localhost:你指定的端口/路径
)。 -
PACT Broker:如果你使用PACT Broker,记得在测试完成后发布PACT。这通常是通过CI/CD管道完成的,但你也可以在本地手动发布。
-
依赖管理:确保你的Flutter项目依赖是最新的,特别是
dart_pact_consumer
插件,因为API可能会随着版本更新而变化。
通过上述步骤,你应该能够在Flutter项目中成功使用dart_pact_consumer
插件来创建和验证PACT协议。