[英]How to unit test a function which calls another that returns a promise?
[英]unit test case for a function which doesn't returns but calls other function
我正在使用angularjs(1.x)作為框架進行項目。 在這個項目中,我有一個Web界面,我提出了一些后端請求。 我覺得有必要為這個工具編寫測試。 所以,我開始為此編寫單元測試用例。 但是現在,我無法為某些功能編寫測試用例。 我的問題是:
我正在嘗試編寫正在發出后端請求的函數的測試用例,並且無論是success
還是error
,我都在調用其他函數。 所以,基本上,這個函數沒有返回任何東西。 那么,我如何測試這個功能呢?
代碼段是:
public makePutRequest(): void {
this.backendService.putBackendRequest(url, backendData, config)
.then((success) => {
successFunction(success); // function call on success
}, (error) => {
errorFunction(error); // function call on error
})
}
backendService中的函數是:
public putBackendRequest(url, backendData, config){
let defered = this.$q.defer();
this.$httpService.put(url, backendData, config)
.success((data, status, headers, config): void => {
if (status === 200) {
// do some further manipulation with data.
}
return defered.resolve(data);
})
.error((data, status, headers, config): void => {
if (status === 500) {
// do some other manipulation.
}
return defered.reject(data);
});
return defered.promise;
}
我正在編寫單元測試測試用例,使用karma作為測試運行器,jasmine作為測試框架,使用angularjs(1.x)作為框架。
現在,我無法弄清楚如何為函數makePutRequest
編寫測試用例,因為它正在獲得promise
,並且在resolve
promise時它正在調用一個函數而在reject
它正在調用其他函數。
我是新手在angularjs中編寫單元測試。 任何有用的建議都會非常有用!
謝謝
您想為backendService構建測試雙精度。 測試雙重將根據您的要求拒絕或解決。 您沒有提到您正在使用的單元測試框架,但是您可以手動構建測試雙精度,或者使用單元測試中的模擬框架來制作測試雙精度,以您想要的方式響應。 一些測試庫,如Jasmine,可以創建內置的測試雙精度。
以下是針對相同類型的服務(調用后端的服務)手動構建的測試雙精度的示例。 您需要某種機制將測試double注入調用服務的測試代碼中。 在下面的示例中,我使用構造函數依賴注入。
正在測試的課程是“App”。 App調用的依賴項/服務稱為“Api”。 在下面的示例中,我測試的是,在App成功接收服務返回的已解析承諾中的數據后,它會在App上正確更新狀態。
it('loads drugs when attached to dom', function(done) {
let response = new Response(JSON.stringify(
[{drugId : "1", name: "drug1", classifications : []}]
));
let fetchPromise = new Promise(function(resolve) {
resolve(response.json());
});
let mockApi = { getDrugs : function() {
return fetchPromise;
}};
let app = new App(mockApi);
app.attached();
fetchPromise.then( function() {
expect(app.availableDrugs.length).toBe(1);
expect(app.availableDrugs[0].drugId).toBe("1");
expect(app.availableDrugs[0].name).toBe("drug1");
done();
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.