Swift Framework for Spy Objects
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:
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:
sourcery --sources "$SOURCESPATH" --templates "$TEMPLATESPATH" --output "$OUTPUTPATH" --args module="$CURRENTFRAMEWORKNAME",import="Foundation",import="UIKit"...
// sourcery: autoSpy
$OUTPUTPATH
on your test projectFranco Meloni, [email protected]
TestSpy is available under the MIT license. See the LICENSE file for more info.