2017-08-03 43 views
0

我正在努力在我的http請求測試中調用catch方法,但我不知道我在做什麼錯誤。我已經將我的測試與在這裏找到的測試者進行了比較,但我不知道我失去了什麼。http請求沒有被茉莉花調用

這是方法我想測試:

public get(apiName, methodName) { 
    return this.http.get(this.url + apiName + "/" + methodName, { 
    headers: headers, 
    search: params 
    }).catch((error) => { 
    this.backendErrorService.notify(this.handleError(error)); 

    return Observable.throw(error); 
    }); 
} 

如果我運行測試,上述方法被調用,我甚至可以檢查是否this.http.get被調用,但我不能讓catch獲得調用。

這是我的測試:

it("should show modal when contract service throws", fakeAsync(() => { 
    // Arrange 
    let http = TestBed.get(Http); 
    let backendService = TestBed.get(BackendErrorService); 
    let backend = TestBed.get(MockBackend); 

    backend.connections.subscribe((connection: MockConnection) => { 
    connection.mockError(new MockError(new ResponseOptions({ type: ResponseType.Error, status: 404, body: {} }))); 
    }); 

    let httpClientService: HttpClientService = new HttpClientService(http, backendService); 

    httpClientService.get("ContractApi", "GetContracts"); 

    // Act 
    fixture.detectChanges(); 

    tick(); 

    // Assert 
    console.log(fixture.debugElement); 
})); 

我缺少什麼?

+0

我不知道不理解更多關於你正在嘗試實現,但我發現提供一個茉莉間諜對象或'spyOn(service.http,'get')'而不是真正的http服務更簡單。這將允許你做'mockHttp.get.and.returnValue(Observable.throw(error))''。 – 0mpurdy

+1

我很高興你找到了你的問題的答案,請張貼它作爲一個答案,而不是作爲編輯[見此爲什麼](https://meta.stackexchange.com/questions/17845/etiquette-for-answering - 你自己的問題):) – 0mpurdy

回答

1

解決方案是添加訂閱。

因爲它是一個可觀察,如果沒有用戶,通話不會進行,這裏的完整的解決方案:

it("should show modal when contract service throws", fakeAsync(() => { 
    // Arrange 
    let http = TestBed.get(Http); 
    let backendService = TestBed.get(BackendErrorService); 
    let backend = TestBed.get(MockBackend); 

    backend.connections.subscribe((connection: MockConnection) => { 
     connection.mockError(new MockError(new ResponseOptions({ type: ResponseType.Error, status: 404, body: {} }))); 
    }); 

    let httpClientService = new HttpClientService(http, backendService); 

    httpClientService.get("ContractApi", "GetContracts").map((res: Response) => {}).subscribe((contracts) => { 
    }); 

    // Act 
    fixture.detectChanges(); 

    tick(); 

    // Assert 
    console.log(fixture.debugElement); 
}));