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

Note UIViewController 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 implementation

    Asks the MTKTestable type to run the given test block on an instance of the MTKTestable type.

    Default Implementation

    Instantiates a new testable instance of a UIViewController or subclass using instanceForTesting, executes loadView & viewDidLoad to prepare the view controller for testing, and then runs the testBlock with this new instance.

    Declaration

    Swift

    static func test(_ testBlock: (TestableItem) -> Void)

    Parameters

    testBlock

    A block of code containing tests to run.

  • Asks the MTKTestable type 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() -> Self

    Return Value

    A new instance, ready for testing.