Last active
October 6, 2015 17:53
-
-
Save akisute/2f87b20272e0c8366694 to your computer and use it in GitHub Desktop.
Example of APIClient and TestCase in Swift, using AFNetworking/Bolts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
// How to make singleton classes in Swift: http://stackoverflow.com/questions/24024549/dispatch-once-singleton-model-in-swift | |
// Basically using global constants is the most easy and safe way to go | |
class APIClient: NSObject { | |
let functionSessionManager:AFHTTPSessionManager | |
class var sharedInstance:APIClient { | |
get { | |
return APIClientSharedInstance; | |
} | |
} | |
init() { | |
let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration() | |
configuration.HTTPAdditionalHeaders = [ | |
"X-Parse-Application-Id": "bSd79gbuQxsyvL1mEF16i9EB58fxr9wQJmLleSG5", | |
"X-Parse-REST-API-Key": "YrmzQ8SmBwmrwlf4nRzOMeJnHkSXjbmNHb108Ds5", | |
"Content-Type": "application/json" | |
] | |
self.functionSessionManager = AFHTTPSessionManager(baseURL:NSURL(string:"https://api.parse.com/1/functions/"), sessionConfiguration:configuration) | |
self.functionSessionManager.requestSerializer = AFJSONRequestSerializer(writingOptions:nil) | |
self.functionSessionManager.responseSerializer = AFJSONResponseSerializer(readingOptions:nil) | |
} | |
func getNewWeaponAsync() -> BFTask { | |
let deferred = BFTaskCompletionSource() | |
self.functionSessionManager.POST("get_new_weapon", parameters:[:], | |
success:{task, responseObject in | |
deferred.setResult(responseObject) | |
}, | |
failure:{task, error in | |
deferred.setError(error) | |
}) | |
return deferred.task | |
} | |
} | |
let APIClientSharedInstance = APIClient() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import XCTest | |
import HelloSwift | |
class HelloSwiftTests: XCTestCase { | |
override func setUp() { | |
super.setUp() | |
} | |
override func tearDown() { | |
super.tearDown() | |
} | |
func testExample() { | |
XCTAssert(true, "Pass") | |
} | |
func testPerformanceExample() { | |
self.measureBlock() { | |
} | |
} | |
/*! | |
* @const XCTPerformanceMetric_WallClockTime | |
* Records wall clock time in seconds between startMeasuring/stopMeasuring. | |
*/ | |
/*! | |
* @const XCTPerformanceMetric_TotalHeapAllocationsKilobytes | |
* Records number of kilobytes allocated in heap across all threads in the process (between startMeasuring/stopMeasuring) | |
*/ | |
/*! | |
* @const XCTPerformanceMetric_PersistentHeapAllocationsKilobytes | |
* Records number of kilobytes allocated in heap but not freed across all threads in the process (between startMeasuring/stopMeasuring) | |
*/ | |
/*! | |
* @method +defaultPerformanceMetrics | |
* The names of the performance metrics to measure when invoking -measureBlock:. Returns XCTPerformanceMetric_WallClockTime, XCTPerformanceMetric_TotalHeapAllocationsKilobytes, and XCTPerformanceMetric_PersistentHeapAllocationsKilobytes by default. Subclasses can override this to change the behavior of -measureBlock: | |
*/ | |
func testPerformanceExample2() { | |
self.measureMetrics(self.dynamicType.defaultPerformanceMetrics(), automaticallyStartMeasuring:false, forBlock:{ | |
self.startMeasuring() | |
self.stopMeasuring() | |
}); | |
} | |
func testPerformanceExample3() { | |
self.measureMetrics([XCTPerformanceMetric_WallClockTime, XCTPerformanceMetric_TotalHeapAllocationsKilobytes, XCTPerformanceMetric_PersistentHeapAllocationsKilobytes], automaticallyStartMeasuring:false, forBlock:{ | |
self.startMeasuring() | |
self.stopMeasuring() | |
}); | |
} | |
func testAsynchronousExample() { | |
let expectation1 = self.expectationWithDescription("Expectation1") | |
// call expectation1.fulfill() when asynchronous task is succeeded | |
// call XCTFail() when asynchronous task is failed | |
APIClient.sharedInstance.getNewWeaponAsync().continueWithExecutor(BFExecutor.mainThreadExecutor(), withBlock:{task in | |
if let e = task.error() { | |
XCTFail("Error: \(e)") | |
} | |
if let result:AnyObject = task.result() { | |
NSLog("Result (1st attempt): \(result)") | |
} | |
return APIClient.sharedInstance.getNewWeaponAsync() | |
}).continueWithExecutor(BFExecutor.mainThreadExecutor(), withBlock:{task in | |
if let e = task.error() { | |
XCTFail("Error: \(e)") | |
} | |
if let result:AnyObject = task.result() { | |
NSLog("Result (2nd attempt): \(result)") | |
} | |
expectation1.fulfill() | |
return nil | |
}) | |
self.waitForExpectationsWithTimeout(10.0, handler:{(error:NSError!) -> Void in | |
// When this handler is called, the asynchronous task is already timed out, or XCTFail() is called | |
// You may not call XCTFail() here because the test is already failed! | |
// You can tear down any resources used, or log something in here | |
if let e = error { | |
println("Error: \(e)") | |
} | |
}) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment