如何單獨為在父函式內呼叫的函式實作存根?
假設我有這些函式 (req1,req2...),它們是來自外部服務的 HTTP 請求,它們都回傳不同的值,有沒有辦法可以單獨為 req1 或 req2 應用存根來模擬它們的值?
這樣做的目的是因為我需要這樣做來測驗依賴于 OTP 驗證的功能,并且我想繞過所述驗證以覆寫我測驗中的所有分支。
import request from 'request-promise'
const request1 = async (data) => return request({uri: "service1.com/get", method: "GET"})
const apiRequests = async (data) => {
const req1 = await request1(data); // I want to mock this value to false
const req2 = await request2(data); // I want to mock this value to true
if (req1 && req2) {
const req3 = await request3(data);
const req4 = await request4(data);
return "Second return"
}
return "First return"
}
每當試圖了解更深層次的嘲弄時,我總是不知所措,而且我在網上看到的大多數示例都沒有嵌套我面臨的問題,所以我對如何繼續處理這個問題感到有些困惑。
我也在一個非常嚴格的設定中作業,所以我真的不允許使用Loopback 的內置測驗庫之外的任何其他庫/包。
uj5u.com熱心網友回復:
您可以使用stub.onCall(n) API。
定義存根在第 n 次呼叫時的行為。用于測驗順序互動。
此外,sinon 不支持從包中匯入獨立函式,您需要使用鏈接接縫,以便我們使用proxyquire包來構建接縫。
例如
apiRequest.ts:
import request from 'request-promise';
const request1 = async (data) => request({ uri: 'service1.com/get', method: 'GET' });
export const apiRequests = async (data) => {
const req1 = await request1(data);
const req2 = await request1(data);
console.log(req1, req2);
if (req1 && req2) {
const req3 = await request1(data);
const req4 = await request1(data);
return 'Second return';
}
return 'First return';
};
apiRequest.test.ts
import proxyquire from 'proxyquire';
import sinon from 'sinon';
describe('70241641', () => {
it('should second return', async () => {
const rpStub = sinon.stub().onCall(0).resolves(true).onCall(1).resolves(true);
const { apiRequests } = proxyquire('./apiRequest', {
'request-promise': rpStub,
});
const actual = await apiRequests('test data');
sinon.assert.match(actual, 'Second return');
});
it('should first second', async () => {
const rpStub = sinon.stub().onCall(0).resolves(false).onCall(1).resolves(true);
const { apiRequests } = proxyquire('./apiRequest', {
'request-promise': rpStub,
});
const actual = await apiRequests('test data');
sinon.assert.match(actual, 'First return');
});
});
測驗結果:
70241641
true true
? should second return (2374ms)
false true
? should first second
2 passing (2s)
---------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
---------------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
apiRequest.ts | 100 | 100 | 100 | 100 |
---------------|---------|----------|---------|---------|-------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/374073.html
上一篇:這將回傳未定義:(節點:3196)UnhandledPromiseRejectionWarning:TypeError:無法讀取未定義的屬性“myArray”
下一篇:Node的mysql中的多個事務
