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
MTKTestable
type to run the given test block on an instance of theMTKTestable
type.Default Implementation
Instantiates a new testable instance of a
UIViewController
or subclass usinginstanceForTesting
, executesloadView
&viewDidLoad
to prepare the view controller for testing, and then runs thetestBlock
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.