Handling errors
Using try!
instead of try
in the call to jsonObject(with:options:)
, you 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 test_Login_WhenJSONIsInvalid_ReturnsError() { mockURLSession = MockURLSession(data: Data(), urlResponse: nil, error: nil) sut.session = mockURLSession let errorExpectation = expectation(description: "Error") var catchedError: Error? = nil sut.loginUser(withName: "Foo", password: "Bar") { (token, error) in catchedError = error errorExpectation.fulfill() } waitForExpectations(timeout: 1) { (error) in XCTAssertNotNil(catchedError) } }
In the test, you feed an empty data object to the completion handler.
Run the tests. The implementation code crashes because the deserialization fails and throws an error. Change the code so that it handles...