Genything

Genything

Swift: 5.0 Platforms: iOS – tvOS – watchOS – macOS Cocoapods Compatible Swift Package Manager Compatible

Genything - 生成任何东西

Genything 是一个致力于轻松且可组合地生成随机数据的库,无论多么复杂。

Genything 可以与 Trickery 结合使用,Trickery 提供了一个不断增长的预制生成器库,用于模拟真实世界的信息。

这两个库都可以用于代码测试、快速原型设计、演示应用程序、UI 测试等等。发挥你的创造力!

为什么要使用 Genything?

生成器 (Generator)

Generator 是 Genything 的核心。

public protocol Generator {
    associatedtype T
    func next(_ randomSource: RandomSource) -> T
}

它定义了一个类型,该类型具有使用 RandomSource 生成值的函数。 RandomSource 用于跟踪和改变任何 RandomNumberGenerator 实例,允许你控制想要的随机性多少

一个布尔生成器可能看起来像这样

struct BoolGenerator: Generator {
    func next(_ randomSource: RandomSource) -> T {
        Bool.random(using: &randomSource.rng)
    }
}

AnyGenerator<Bool> { randomSource in
    Bool.random(using: &randomSource.rng)
}

或者,我们可以利用 Genything 对大多数标准 Swift 类型(包括 Bool)的任意一致性

Bool.arbitrary

Genything 提供了许多方法来在 Generators 命名空间下 创建你自己的生成器,并且 Generator 类型被许多 运算符扩展,你可以使用它们来进一步改变和控制生成的生成器。

Arbitrary(任意)

Arbitary 协议允许一个 Type 定义一个适合生成其所有值的生成器。

以 Swift 的 Bool 为例,它的 Arbitrary 定义为

extension Bool: Arbitrary {
    public static var arbitrary: AnyGenerator<Bool> {
        [true, false].arbitrary
    }
}

现在,当组合更复杂的任意类型时,我们可以自动使用这个定义

struct Foo {
  let bar: Bool
  // ...
}

extension Transaction: Arbitrary {
    public static var arbitrary: AnyGenerator<Bool> {
        Gen.compose { generate in
          Foo(
            bar: generate(), // Will return true/false like a coin-flip for each generated value
            //...
          )
        }
    }
}

这些可以用于不变式测试、存根 API 响应、作为预览数据等等...

Trickery(欺骗)

Genything 与 Trickery 一起提供,Trickery 是一个生成器集合,适用于根据真实世界条件而非仅由类型强制执行的条件生成伪真实数据。

考虑一个电话号码。 类型为 String 的电话号码具有关于长度、格式、允许字符的规则。 然而,任意类型 String 最多包含对其长度的定义

GenythingTest

Genything 为 XCTestCase 提供了两个扩展,我们建议你将它们用作属性测试的主要方法。

示例

查看我们的 Playground 指南

混入 (Mixins)

Genything 很高兴与其他开源库结合使用!

使用 SFSafeSymbols 生成任意 SFSymbols

生成任何 SF Symbol

import SFSafeSymbols

let sfSymbolGen: AnyGenerator<SFSymbol> = SFSymbol.arbitrary.map { $0.rawValue }

安装

Cocoapods

pod 'Genything'
pod 'Trickery' # Optional library of realistic fake data (Fake)
pod 'GenythingTest' # Optional extensions for property testing (testAll, testAllSatisfy)

Swift Package Manager

在你的根目录中创建一个 Package.swift 文件并添加

dependencies: [
    .package(url: "https://github.com/justeattakeaway/genything.git", .upToNextMajor(from: "1.0.0"))
]

然后添加你想要的包

致谢

Genything 项目由 SkipTheDishes 拥有和维护,SkipTheDishes 是 Just Eat Takeaway.com 的子公司。

贡献

请阅读 贡献指南

灵感

Genything 站在巨人的肩膀上。 请查看这些其他的库和资源!

许可证

参见:许可证

Apache License Version 2.0, January 2004 https://apache.ac.cn/licenses/