StubKit 0.1.6

StubKit 0.1.6

Bartosz Polaczyk 维护。



StubKit 0.1.6

StubKit

Build Status codecov Carthage Compatible SPM Compatible Version License Platform

概述

描述

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"添加到您的依赖项中。

Carthage

将以下行添加到您的Cartfile

github "polac24/StubKit" ~> 0.1

有关集成carthage依赖项的详细说明,请参阅Carthage

CocoaPods

StubKit通过CocoaPods提供。要安装它,只需为您测试目标添加一个StubKit依赖项,例如

target 'StubKitExampleTests' do
    inherit! :search_paths
    pod 'StubKit'
end

作者

Bartosz Polaczyk,[email protected]

许可协议

StubKit在MIT许可下可用。有关更多信息,请参阅LICENSE文件。