ValidModel
ValidModel 通过增强应用程序模型,使数据处理更安全,推理更简单。
在许多情况下,项目中充斥着'mocks'。它们确实提供了良好的价值,但它也带来了额外的开发和维护成本,包括加载模拟系统和模拟文件的.mock(加载模拟数据的源代码,与模型格式相匹配的模拟数据文件)。
简单来说,ValidModel 提出了一种与应用程序模型工作的全新工作流程,其核心是验证。假设有一个模型,所有必要的属性都有清晰的定义的最小-最大值范围。仅仅通过了解最小-最大限制信息,就能轻松
- 确认给定的模型实例包含应用程序知道如何处理的正确值。
- 为测试生成新模型实例(N 次,无论您是在处理 UI 边界情况还是在处理尚未可用的 API,这些实例就像模拟数据中的对象一样,但自动生成,N 次)。
从实现的角度来看,它需要定义模型契约。指定了名为 MyModel 的模型 - 定义 MyModelContract。在 MyModelContract 中 - 描述 MyModel 的属性类型和约束。
契约本质上描述了属性的约束、其类型以及属性应有的值范围。例如,考虑一个用户模型
struct User: Decodable {
var firstName: String
var email: String
}
创建 UserContract 并描述适合 'email' 和 'firstName' 属性的最佳值类型
struct UserContract: ModelContract {
typealias M = User // UserContract describes concrete contract for 'User' model.
typealias P = PropertyPolicy
// 'email' name matches User.email property = (KeyPath \M.email targets User.email, validator 'EmailValidator' explicitly describes property value)
let email: P = (\M.email, EmailValidator())
// 'firstName' name matches User.firstName = (KeyPath \M.firstName targets User.firstName property, validator 'StringValidator' explicitly constrains value to be a String of 1-30 chars length)
let firstName: P = (\M.firstName, StringValidator(length: (min: 1, max: 30)))
}
描述契约后,很容易
- 验证模型实例
- 生成示例实例(用于测试目的等)
以下是代码示例
let validator = ModelValidator() // instantiate model validator once and reuse later.
let user: User = ... // assuming instance exists, from API response and JSONDecod-ed into object.
let contract = UserContract()
// Validate model instance:
let isValid = try? validator.validate(user, using: contract)
let generator = ModelGenerator() // instantiate once and reuse later.
// Generate new instance with 'random' values for testing purposes:
let dummyUser: User = try? generator.model(from: contract, aggregate: .random)
示例
要运行示例项目,请克隆仓库,然后先从 Example 目录运行 pod install
安装
ValidModel可以通过CocoaPods获得。要安装它,只需将以下行添加到您的Podfile中
pod 'ValidModel'
基础版本
pod 'ValidModel/Base'
- 仅包括: 'StringValidator', 'IntValidator' 和 'DoubleValidator'。
扩展版本
pod 'ValidModel/Extended'
- 提供更多验证器(EmailValidator, LastNameValidator等),但需要依赖于'Fakery' pod。
作者
kernel, ReImpl.
许可证
ValidModel受MIT许可证保护。更多信息请参阅LICENSE文件。