2017-10-01 22 views
1

以下のテストを確認して、スパイが決して呼び出されない理由を確認できますか?実際のコードは正常に動作しますが、テストは実行されません。モックでスパイが呼び出されない理由(角4)

の中の何かがspyOnの場合、テストに合格します。非常に奇妙な!

ありがとうございます。

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 ); 
    } 
} 

そして結果:

enter image description hereあなたはMockClass.fetch medhodが実際にあなたが.subscribe方法でそれをチェーンので、それ以外の場合はエラーが発生しますし、テストができなくなります(ないだけでスタブ)と呼ばれていることを確認する必要があり

答えて

1

合格。したがって、callThroughを使用する必要があります。

spy = spyOn(mockClass, 'fetch').and.callThrough(); 
           ^^^^^^^^^^^^^^^^^^ 
            add this 
関連する問題