I'm writing integration tests in Xcode 6 to go alongside my unit and functional tests. XCTest has a setUp() method that gets called before every test. Great!
It also has XCTestException's which let me write async tests. Also great!
However, I would like to populate my test database with test data before every test and setUp just starts executing tests before the async database call is done.
Is there a way to have setUp wait until my database is ready before it runs tests?
Here's an example of what I have do now. Since setUp returns before the database is done populating I have to duplicate a lot of test code every test:
func test_checkSomethingExists() {
    let expectation = expectationWithDescription("")
    var expected:DatabaseItem
    // Fill out a database with data. 
    var data = getData()
    overwriteDatabase(data, {
      // Database populated.
      // Do test... in this pseudocode I just check something...
      db.retrieveDatabaseItem({ expected in
        XCTAssertNotNil(expected)
        expectation.fulfill()
      })
    })
    waitForExpectationsWithTimeout(5.0) { (error) in
        if error != nil {
            XCTFail(error.localizedDescription)
        }
    }
}
Here's what I would like:
class MyTestCase: XCTestCase {
    override func setUp() {
        super.setUp()
        // Fill out a database with data. I can make this call do anything, here
        // it returns a block.
        var data = getData()
        db.overwriteDatabase(data, onDone: () -> () {
           // When database done, do something that causes setUp to end 
           // and start running tests
        })        
    }
    func test_checkSomethingExists() {
        let expectation = expectationWithDescription("")
        var expected:DatabaseItem
          // Do test... in this pseudocode I just check something...
          db.retrieveDatabaseItem({ expected in
            XCTAssertNotNil(expected)
            expectation.fulfill()
        })
        waitForExpectationsWithTimeout(5.0) { (error) in
            if error != nil {
                XCTFail(error.localizedDescription)
            }
        }
    }
}
 
     
     
     
     
     
     
    