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...
 
                                             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
     
         
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                