2017-10-01 2 views
1

Pouvez-vous vérifier le test ci-dessous et voir pourquoi l'espion n'est jamais appelé? Le code fonctionne bien, mais le test ne joue pas.Pourquoi le Spy n'est pas appelé dans le Mock (Angular 4)

Si je spyOn quelque chose à l'intérieur du this.apiSrv.fetch passe alors le test bien. Très étrange!

merci d'avance.

manager.service.spec.ts

describe('ManagerService',() => { 

    const mockClass = new MockClass(); 
    let spy; 

    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     ManagerService, 
     { provide: ApiService, useValue: mockClass}, 
     ] 
    }); 
    spy = spyOn(mockClass, 'fetch'); 
    }); 

    fit('should call server', inject([ManagerService], (service: ManagerService) => { 
     service.callServer(); 
     expect(spy).toHaveBeenCalled(); 
    })); 

}); 

manager.service.ts

@Injectable() 
export class ManagerService { 
    constructor(
    private apiSrv: ApiService, 
) {} 

    public callServer() { 
    this.apiSrv.fetch('http://url.com').subscribe((data) => { 
     console.log(data); 
    }); 
    } 
} 

api.service.ts

export class ApiService { 

    constructor(private http: Http) {} 

    fetch(resource: string) { 
     return this.http.get(resource).map((response) => response.json()); 
    } 
} 

mock.ts

export class MockClass { 
    public fetch(): Observable<any> { 
     const expectedResult = { 
     items: { 
      data: [], 
     } 
     }; 
     return Observable.of(expectedResult ); 
    } 
} 

Et le résultat:

enter image description here

Répondre

1

Vous devez vous assurer que MockClass.fetch medhod est en fait appelé (pas seulement écrasa) parce que vous enchaînez avec .subscribe méthode sinon il provoque l'erreur et le test ne sera pas passé. Donc callThrough devrait être utilisé.

spy = spyOn(mockClass, 'fetch').and.callThrough(); 
           ^^^^^^^^^^^^^^^^^^ 
            add this