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.
By chaining the spy with and.returnValues, all calls to the function will return specific values in order until it reaches the end of the return values list.
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.
By chaining the spy with and.callFake, all calls to the spy will delegate to the supplied function.