Using try!
instead of try
in the call to JSONObjectWithData(_:options:)
, we tell the compiler: "Trust me on this: This method will never fail.". Let's write a test that feeds in wrong data and asserts that an error is thrown:
func testLogin_ThrowsErrorWhenJSONIsInvalid() { var theError: ErrorType? let completion = { (error: ErrorType?) in theError = error } sut.loginUserWithName("dasdom", password: "1234", completion: completion) let responseData = NSData() mockURLSession.completionHandler?(responseData, nil, nil) XCTAssertNotNil(theError) }
In the test, we call the completion handler with an empty data object.
Run the tests. The implementation code crashes because the deserialization fails and throws an error. Let's change the code that it handles the thrown error correctly. Replace the contents of the completion handler with this:
do { let responseDict = try NSJSONSerialization.JSONObjectWithData(data!,...