Swift version: 5.6
One of the many brilliant features of Swift’s error handling system is its ability to throw errors during tests and have them considered as failures. That is, if you mark your test using throws
you run any throwing code inside that test and if it throws an error the test will be marked as a failure.
For example, if I have an ImageGenerator
struct that has a throwing method called generateImages()
, I could test it out using code like this:
func testFailingExample() throws {
let generator = ImageGenerator()
let result = try generator.generateImages()
XCTAssertTrue(result, "Image generation should complete successfully.")
}
That creates an instance of the struct, attempts to run its generateImages()
method, then asserts that the result of the method was true. If generateImages()
throws an error it won’t be caught inside the test – there’s no do
/catch
blocks in there – so instead it will bubble up to the XCTestCase
, which will automatically mark the test as being failed.
Although this approach works well for individual throwing methods like you see above, I don’t think you should use it for more complex tests because you can mask failures too easily. If you have three throwing function calls inside a single test, it’s a better idea to wrap them individually in do
/catch
blocks so you can deal with the error inline by calling XCTFail()
at the point of failure.
SPONSORED AppSweep by Guardsquare helps developers automate the mobile app security testing process with fast, free scans. By using AppSweep’s actionable recommendations, developers can improve the security posture of their apps in accordance with security standards like OWASP.
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.