MTKTestable
public protocol MTKTestable
The MTKTestable protocol provides an alternative, functional approach to XCTest‘s built in setUp & tearDown methods for handling unit tests.
instanceForTesting() should provide a new instance for each call.
test(_:) should effectively follow this pattern:
static func test(_ testBlock: (Self) -> Void) {
let testInstance = instanceForTesting()
// any code that would previously live in setUp
testBlock(testInstance)
// any code that would previously live in tearDown
}
With these methods implemented, our test cases now look like this:
func testThings() {
FooBarClass.test { testInstance in
XCTAssertNil(testInstance.thingThatShouldBeNil)
}
}
This allows setUp & tearDown code to exist across multiple files. Moreover, setUp & tearDown logic could now be inherited. As well, MTKTestable protocol extensions could be written to generalize some of the setUp & tearDown logic for large collections of types.
Note
NoteUIViewController and its subclasses get a free implementation of test(_:) as long as they have implemented instanceForTesting(). The default test(_:) implementation for view controllers calls loadView() and viewDidLoad() before running the testBlock.
-
test(_:)Default implementationAsks the
MTKTestabletype to run the given test block on an instance of theMTKTestabletype.Default Implementation
Instantiates a new testable instance of a
UIViewControlleror subclass usinginstanceForTesting, executesloadView&viewDidLoadto prepare the view controller for testing, and then runs thetestBlockwith this new instance.Declaration
Swift
static func test(_ testBlock: (TestableItem) -> Void)Parameters
testBlockA block of code containing tests to run.
-
Asks the
MTKTestabletype for a new instance in order to be used for testing. This method should provide a new instance every time.Declaration
Swift
static func instanceForTesting() -> SelfReturn Value
A new instance, ready for testing.
View on GitHub
MTKTestable Protocol Reference