title: Jasmine spy is not overwriting mock implementation
body: <p>In the ngOnInit method of the class I am testing I call a function of a service which retruns an observable. I have implemented a mock for the service, but I'm trying to use a spy for this exact test case. 
  In my understanding the spy would overwrite the mock implementation unless I call ".and.callThrough()" on the spy. The problem is that everytime the mock implementation still gets executed although I set up a spy for the function.</p>
  
  <p>I tried moving the spy into the beforeEach section which did not help.
  Also I tried to use the spy without the ".and.callFake()" extension. But it didn't help.</p>
  
  <p><strong>spec.ts file:</strong></p>
  
  <pre><code>fdescribe('AppComponent', () =&gt; {
    let fixture;
    let component;
    let dataServiceMock: DataServiceMock;
  
    beforeEach(async(() =&gt; {
      TestBed.configureTestingModule({
        imports: [RouterTestingModule],
        declarations: [AppComponent],
        providers: [{ provide: DataService, useClass: DataServiceMock }],
        schemas: [CUSTOM_ELEMENTS_SCHEMA]
      }).compileComponents();
    }));
  
    beforeEach(() =&gt; {
      fixture = TestBed.createComponent(AppComponent);
      component = fixture.componentInstance;
      fixture.detectChanges();
  
      dataServiceMock = TestBed.get(DataService);
    });
  
  
    fit('should not show navigation if not logged in', async(() =&gt; {
     spyOn(dataServiceMock,'getCurrentUser').and.callFake(() =&gt; {
       console.log('IN CALL FAKE')
       throwError(new Error('induced error'))
     });
   }));
  </code></pre>
  
  <p><strong>implementation of service mock:</strong></p>
  
  <pre><code>export class DataServiceMock {
    currentUser: User;
  
    private createValidUser() {
      let validUser = new User();
      validUser.username = 'valid';
      validUser.password = 'valid';
      validUser.role = 'valid';
      this.currentUser = validUser;
    }
  
    public getCurrentUser(): Observable&lt;User&gt; {
      this.createValidUser();
      return of(this.currentUser);
    }
  </code></pre>
  
  <p><strong>ngOnInit of component that is tested:</strong></p>
  
  <pre><code>ngOnInit(): void {
    this.dataService.getCurrentUser().subscribe(user =&gt; {
      this.currentUser = user;
      console.log('received user:', this.currentUser)
    })
  }
  </code></pre>
  
  <p>I expect that the console log prints out "IN CALL FAKE" and throws the "induced error" but instead the console prints out "received user:" and the validUser that is created in the service mock.</p>