By chaining the spy with and.callFake, all calls to the spy will delegate to the supplied function.
By chaining the spy with and.callThrough, the spy will still track all calls to it but in addition it will delegate to the actual implementation.
By chaining the spy with and.returnValue, all calls to the function will return a specific value.
When a calling strategy is used for a spy, the original stubbing behavior can be returned at any time with and.stub.
By chaining the spy with and.throwError, all calls to the spy will throw the specified value.