Swift version: 5.10
All XCTestCase
subclasses have access to setUp()
and tearDown()
instance methods, plus setUp()
and tearDown()
class methods for one-time setup and tear down. But sometimes you need to add conditional tear down code: if your test creates a resource that must be destroyed, you can add that as an additional tear down step using the addTeardownBlock()
method.
As an example, consider this test method:
func testDatabaseQuery() {
let database = connectToDatabase()
let results = database.fetchExampleData()
XCTAssertEqual(results.count, 1, "We should receive exactly one result.")
}
That connects to a database, runs an example query, and checks the result. However, behind the scenes our database needs to be reset every time a connection is finished. If all our tests relied on the database being created then we could add the cleanup code either to the tearDown()
instance method or to the tearDown()
class method, but if it’s only used sometimes then that isn’t an option.
Fortunately, the addTeardownBlock()
is designed to fix this: you can pass in any code you want to run when your test is being torn down, and it will be run after the current test finishes, but before the tearDown()
instance method.
In the case of the connectToDatabase()
method that needs clean up, we could write that clean up code directly into each test, but that just duplicates code and is likely to cause problems. So, instead we’re going to add the clean up right inside the connection code, like this:
func connectToDatabase() -> Database {
let database = Database()
database.connect()
addTeardownBlock {
database.cleanUp()
}
return database
}
That database.cleanUp()
code will be called only when the surrounding test is complete, so it acts a bit like defer
except the scope is the current test.
It’s important to get the order of set up and tear down correct, because various things happen at different times. If you have two tests in your XCTestCase
here’s how it would look:
setUp()
class method is called.setUp()
instance method is called.tearDown()
instance method is called.setUp()
instance method is called again.tearDown()
instance method is called again.tearDown()
class method is called.You won’t need to use tear down blocks often, but they are a useful tool to have.
SPONSORED Debug 10x faster with Proxyman. Your ultimate tool to capture HTTPs requests/ responses, natively built for iPhone and macOS. You’d be surprised how much you can learn about any system by watching what it does over the network.
Sponsor Hacking with Swift and reach the world's largest Swift community!
Available from iOS
This is part of the Swift Knowledge Base, a free, searchable collection of solutions for common iOS questions.
Link copied to your pasteboard.