Connect-Swift-Mocks 1.0.0-rc1

Connect-Swift-Mocks 1.0.0-rc1

Michael Rebello 维护。



 
依赖项
Connect-Swift= 1.0.0-rc1
SwiftProtobuf~> 1.27.1
 

  • Connect 作者团队

Connect-Swift

Build Version Platform License

Connect-Swift 是一个小型库 (<200KB!),它提供支持使用生成的、类型安全和惯用的 Swift API 与您的应用程序服务器进行通信的功能,使用 Protocol Buffers (Protobuf)。它与 ConnectgRPCgRPC-Web 协议一起工作。

想象一个世界,您不需要手动编写用于 REST/JSON 端点的 Codable 模型,而是可以直接调用一个生成的 API 方法,该方法是保证与服务器模型匹配的。另外,想象一下,您永远不必再担心序列化,并且可以使用符合相同协议的生成模拟轻松编写测试。所有这一切都可通过 Connect-Swift 实现。

给定一个简单的 Protobuf 模式,Connect-Swift 会生成惯用的 Swift 协议接口和客户端实现

点击展开 eliza.connect.swift
public protocol Eliza_V1_ChatServiceClientInterface: Sendable {
    func say(request: Eliza_V1_SayRequest, headers: Headers)
        async -> ResponseMessage<Eliza_V1_SayResponse>
}

public final class Eliza_V1_ChatServiceClient: Eliza_V1_ChatServiceClientInterface, Sendable {
    private let client: ProtocolClientInterface

    public init(client: ProtocolClientInterface) {
        self.client = client
    }

    public func say(request: Eliza_V1_SayRequest, headers: Headers = [:])
        async -> ResponseMessage<Eliza_V1_SayResponse>
    {
        return await self.client.unary(path: "connectrpc.eliza.v1.ElizaService/Say", request: request, headers: headers)
    }
}

此代码可以通过几行集成

final class MessagingViewModel: ObservableObject {
    private let elizaClient: Eliza_V1_ChatServiceClientInterface

    init(elizaClient: Eliza_V1_ChatServiceClientInterface) {
        self.elizaClient = elizaClient
    }

    @Published private(set) var messages: [Message] {...}

    func send(_ userSentence: String) async {
        let request = Eliza_V1_SayRequest.with { $0.sentence = userSentence }
        let response = await self.elizaClient.say(request: request, headers: [:])
        if let elizaSentence = response.message?.sentence {
            self.messages.append(Message(sentence: userSentence, author: .user))
            self.messages.append(Message(sentence: elizaSentence, author: .eliza))
        }
    }
}

就是这样!您不再需要手动定义 Swift 响应模型,添加 Codable 符合性,编写 URL(string: ...) 初始化器,甚至创建封装服务类的协议接口 - 所有这些 Connect-Swift 都为您处理,并且底层的网络传输也是自动处理的。

使用与生产客户端相同的协议接口的生成模拟,测试也变得轻而易举

点击展开 eliza.mock.swift
open class Eliza_V1_ChatServiceClientMock: Eliza_V1_ChatServiceClientInterface, @unchecked Sendable {
    public var mockAsyncSay = { (_: Eliza_V1_SayRequest) -> ResponseMessage<Eliza_V1_Response> in .init(message: .init()) }

    open func say(request: Eliza_V1_SayRequest, headers: Headers = [:])
        async -> ResponseMessage<Eliza_V1_SayResponse>
    {
        return self.mockAsyncSay(request)
    }
}
func testMessagingViewModel() async {
    let client = Eliza_V1_ChatServiceClientMock()
    client.mockAsyncSay = { request in
        XCTAssertEqual(request.sentence, "hello!")
        return ResponseMessage(result: .success(.with { $0.sentence = "hi, i'm eliza!" }))
    }

    let viewModel = MessagingViewModel(elizaClient: client)
    await viewModel.send("hello!")

    XCTAssertEqual(viewModel.messages.count, 2)
    XCTAssertEqual(viewModel.messages[0].message, "hello!")
    XCTAssertEqual(viewModel.messages[0].author, .user)
    XCTAssertEqual(viewModel.messages[1].message, "hi, i'm eliza!")
    XCTAssertEqual(viewModel.messages[1].author, .eliza)
}

快速入门

前往我们的快速入门教程开始操作。完成一个使用Connect-Swift的运行中的SwiftUI聊天应用仅需大约10分钟。

文档

包括拦截器、模拟/测试、流、错误处理等所有内容的全面文档都可以在connectrpc.com网站上找到。

示例应用

示例应用位于Examples目录中,可以使用Xcode打开和构建。它们展示了

贡献

我们很愿意得到您的帮助,使Connect变得更好!

关于在本地构建库和生成器插件、运行测试和对仓库进行贡献的详细介绍在CONTRIBUTING.md指南中提供。请查看详细信息。

生态系统

  • connect-kotlin: 为 Kotlin 提供惯用 gRPC 和 Connect RPC
  • connect-go: 服务器 stubs 服务的 Go 语言实现
  • connect-es: 基于 Protobuf 和 TypeScript 的类型安全 API
  • Buf Studio: 用于临时 RPC 的 Web 界面
  • conformance: Connect、gRPC 和 gRPC-Web 互操作性测试

状态

该项目处于测试阶段,我们可能会根据早期用户的反馈进行一些修改。加入我们的 Slack 社群吧!

法务

此服务提供 Apache 2 许可证下。