sabirvirtuoso / Mockit

A simple mocking framework for Swift, inspired by the famous http://mockito.org/
MIT License
120 stars 27 forks source link

Issue with testing func with a closure parameter #13

Closed SheveleR closed 7 years ago

SheveleR commented 7 years ago

Greetings! Have a some problems with testing func, which have call function with a closure parameter inside MVP architecture, testing non-mock Presenter with mocked ViewController Presenter - func chooseTypeOfPurpose() { view.showCategory(purposes: purposes, currentPurpose: currentPurpose) { (otherCategory) in if let category = otherCategory { self.setCategory(category) self.updateButtons() } } } MockViewController - func showCategory(purposes: [PurposeObject], currentPurpose: PurposeObject?, completion: @escaping (PurposeObject?) -> Void) { let viewController = PurposeViewController() viewController.purposeHandler = completion viewController.allPurposes = purposes viewController.currentPurpose = currentPurpose; self.navigationController?.pushViewController(viewController, animated: true) } So, what i can do in this situation? Can i handle completion with Mockit like in Mockito with argumentcaptor?

sabirvirtuoso commented 7 years ago

You can stub calls to functions having closure parameters which in your case can be for example

let dummyPurposesArray = [PurposeObject] () let dummyPurpose = PurposeObject()

let dummyCompletionHandler = { (PurposeObject?) -> Void in }

let stubbedPurposeObject = PurposeObject()

mockViewController.when().call(withReturnValue: mockViewController.showCategory(purposes: dummyPurposesArray, currentPurpose: dummyPurpose, completion: dummyCompletionHandler), andArgumentMatching: [Anything(), Anything(), Anything()]).thenDo { (args: [Any?]) -> Void in (args[2] as! (PurposeObject?) -> (Void))(stubbedPurposeObject) }

So yes argumentcaptor is possible here like Mockit and you can pass in your desired purposeObject when stubbing.

Hope it helps.