Xcode单元测试

2017/03/02

基础逻辑测试

    override func setUp() {
        super.setUp() //为开始测试准备环境
        api = RxMoyaProvider<LemeAPI>(stubClosure: MoyaProvider.neverStub)
    }
    override func tearDown() {
        super.tearDown()//测试结束释放资源
    }
    func testFuncName(){//测试方法以test开头
        let ret = FuncName()//return "88"
        XCTAssertEqual(ret, "88")
    }

异步加载测试

func testGetSomeData() { //以test开头
    let e = expectation(description: "GetSomeData Error")
    self.api
        .request(LemeAPI.GetSomeData)
        .map(to: SomeData.self)
        .subscribe(onNext: { (someData) -> Void in
            XCTAssertEqual(someData.login, "http://api.spottly.com/login")
            e.fulfill()
        }, onError: { (error) -> Void in
            print(error)
            XCTFail("Error")
        }).addDisposableTo(self.disposeBag)
    
    waitForExpectations(timeout: 10) { (error) in
        print(error)
    }
}

数据Mock测试

当测试的目标依赖其他对象时,可以用Mock用于模拟一个对象的返回

MyClass.swift

import Foundation
import CoreData

class MyClass {
    let context: NSManagedObjectContext
    
    init(managedObjectContext: NSManagedObjectContext) {
        self.context = managedObjectContext
    }
    
    // If the array returned from executing a fetch request contains objects, return true; if empty, return false
    func databaseHasRecordsForSomeEntity() -> Bool {
        let fetchRequest = NSFetchRequest(entityName: "SomeEntity")
        let fetchRequestResults = self.context.executeFetchRequest(fetchRequest, error: nil) // May want to do something with the error in real life...
        return (fetchRequestResults?.count > 0)
    }
}

TestFile.swift

  // Yay for verbose test names!  :]
    func testDatabaseHasRecordsForSomeEntityReturnsTrueWhenFetchRequestReturnsNonEmptyArray() {
        class MockNSManagedObjectContext: NSManagedObjectContext {
            override func executeFetchRequest(request: NSFetchRequest, error: NSErrorPointer) -> [AnyObject]? {
                return ["object 1"]
            }
        }
        
        // Instantiate mock
        let mockContext = MockNSManagedObjectContext()
        
        // Instantiate class under test and pass it the mockContext object
        let myClassInstance = MyClass(managedObjectContext: mockContext)
        
        // Call the method under test and store its return value for XCTAssert
        let returnValue = myClassInstance.databaseHasRecordsForSomeEntity()
        
        XCTAssertTrue(returnValue == true, "The return value should be been true")
    }

参考

Code Coverage 测试覆盖率

在product->scheme->Edit Scheme->Test里面将Code Coverage模式打开 测试成功后可以在这里看到

参考

Post Directory