Swift Framework for Spy Objects
- Swift: 4.0
- iOS: 9+
To create a spy object you just have to implement the TestSpy protocol on your test class.
class TestClass: TestSpy {
enum Method: Equatable {
case test
case testWithArgument(arument: Int)
}
var callstack = CallstackContainer<Method>()
}
Then when the method you want to test is called you have to record the method in the callstack
extension TestClass: TestProtocol {
func test() {
callstack.record(.test)
}
func testWithArgument(argument: Int) {
callstack.record(.testWithArgument(argument: argument))
}
}
XCTAssertTrue(spyObject.check(method: .test, predicate: CallstackMatcher.any))
expect(spyObject).to(haveReceived(.test))
There are some default matchers that can be used on the test to check that callstack content.
The main matchers are:
- times(Int)
- atLeast(times: Int)
- never
- any
- before(Method)
- immediatelyBefore(Method)
- after(Method)
- immediatelyAfter(Method)
XCTAssertTrue(spyObject.check(method: .test, predicate: CallstackMatcher.before(.testWithArgument(argument: 1))))
expect(spyObject).to(haveReceived(.test), .before(.testWithArgument(argument: 1)))
Sourcery offers a good way to automatically generate spy objects. You can find an example stancil file to generate Spy Objects here
to use it:
- add a script phase, before the compile sources phase, in your test project with:
sourcery --sources "$SOURCESPATH" --templates "$TEMPLATESPATH" --output "$OUTPUTPATH" --args module="$CURRENTFRAMEWORKNAME",import="Foundation",import="UIKit"...
- add this annotation to the protocol you want to spy
// sourcery: autoSpy
- include the files generated at
$OUTPUTPATH
on your test project
Franco Meloni, franco.meloni91@gmail.com
TestSpy is available under the MIT license. See the LICENSE file for more info.