StubKit
概述
描述
StubKit 提供了一组加速构建 Swift 拦截器/模拟的功能。它的目标是要求在模拟创建过程中开发者做最少的编码工作,同时利用 Swift 的类型系统类型完整性来保证安全,无需元编程或任何代码生成。
使用 StubKit 创建的拦截器提供
- 函数调用完全的递归
- 传递的参数
- 以声明性方式指定其返回值(synchronous and asynchronous)
- 验证模拟的期望(同步和异步)
示例
// Implementation target: Sample protocol
protocol Database {
func addUser(name: String) -> Int
func addAccount(givenName: String, lastName: String) throws -> Int
}
// Test target: mock creation
class DatabaseStub: Database {
lazy var addUserAction = stub(of: addUser)
func addUser(name: String) -> Int {
return addUserAction(name)
}
lazy var addAccountAction = stub(of: addAccount)
func addAccount(givenName: String, lastName: String) throws -> Int {
return try addAccountAction((givenName, lastName))
}
}
// Test target, testcase Arange
let databaseStub = DatabaseStub()
调用和参数验证
let addUserSpy = spyCalls(of: &databaseStub.addUserAction)
let addAccountSpy = spyCalls(of: &databaseStub.addAccountAction)
databaseStub.addUser(name: "User1") // return 0 (Int's default)
try databaseStub.addAccount(givenName: "John", lastName: "Appleseed") // returns 0
XCTAssertEqual(addUserSpy, ["User1"])
XCTAssertEqual(addAccountSpy.count, 1)
XCTAssertEqual(addAccountSpy[0]?.0, "John")
XCTAssertEqual(addAccountSpy[0]?.1, "Appleseed")
动态控制返回值
setupStubSequence(of: &databaseStub.addUserAction).returns(11)
setupStubSequence(of: &databaseStub.addAccountAction)
.returnsOnce(1)
.throws(DatabseError.ioError)
databaseStub.addUser(name: "User2") // return 11
try databaseStub.addAccount(givenName: "John", lastName: "Appleseed") // returns 1
try databaseStub.addAccount(givenName: "John", lastName: "Appleseed") // throws `DatabseError.ioError`
同步模拟验证
let user3Squence = setupStubSequence(of: &databaseStub.addUserAction)
.when("User3")
.expect(.once)
let user3TwiceSquence = setupStubSequence(of: &databaseStub.addUserAction)
.when("User3")
.expect(.times(2))
let appleseedSquence = setupStubSequence(of: &databaseStub.addAccountAction)
.whenSecond("Appleseed")
.expect(.atLeastOnce)
.returns(99)
databaseStub.addUser(name: "User3") // return 0
try databaseStub.addAccount(givenName: "John", lastName: "Appleseed") // returns 99
try databaseStub.addAccount(givenName: "Tim", lastName: "Appleseed") // returns 99
SKTVerify(user3Squence) // ✅
SKTVerify(user3TwiceSquence) // 🛑
SKTVerify(appleseedSquence) // ✅
XCTAssert(appleseedSquence.verify()) // ✅ - equivalent to SKTVerify(appleseedSquence)
异步模拟验证
setupStubSequence(of: &databaseStub.addUserAction)
.when("User3")
.expect(.once)
.attach(expectation(description: "User3 added once"))
setupStubSequence(of: &databaseStub.addAccountAction)
.whenFirst("John")
.expect(.once)
.attach(expectation(description: "John added once"))
.returns(100)
DispatchQueue.global(qos: .background).async {
databaseStub.addUser(name: "User3") // return 0
try? databaseStub.addAccount(givenName: "John", lastName: "Appleseed") // returns 100
try? databaseStub.addAccount(givenName: "Tim", lastName: "Appleseed") // returns 99
}
waitForExpectations(timeout: 0.1) //✅
完整的API文档
有关API文档,请参阅外部文档:API文档
要求
Swift | StubKit |
---|---|
4.2 , 5.0 |
~> 0.1 |
StubKit在Swift 4.2和Swift 5.0之间不引入任何更改
安装
Swift包管理器
要依赖StubKit包,您需要在您的Package.swift
中声明您的依赖项。
.package(url: "https://github.com/polac24/StubKit.git", from: "0.1.0")
并为您的应用程序/库目标,将"StubKit"添加到您的依赖项中。
CocoaPods
StubKit通过CocoaPods提供。要安装它,只需为您测试目标添加一个StubKit
依赖项,例如
target 'StubKitExampleTests' do
inherit! :search_paths
pod 'StubKit'
end
作者
Bartosz Polaczyk,[email protected]
许可协议
StubKit在MIT许可下可用。有关更多信息,请参阅LICENSE文件。