![](/img/trans.png)
[英]Test if function of object has been called inside another function in jest
[英]How to test a function has been called inside another function
我有一個表格。 當用戶從步驟1轉到步驟2時,代碼會在將用戶移至步驟2之前檢查步驟1中的所有必填字段。當用戶位於步驟2、3或4並點擊刷新或在新窗口中打開網址時,它們將被重定向到簡介頁面。
我的問題是測試代碼以及要測試的內容。
我正在使用React,Redux,Jest和Sinon。
// actions.js export const redirectToIntroPage = () => (dispatch, getState) => { const fields = { field1: getState().app.inputs.field1, field2: getState().app.inputs.field2, field3: getState().app.inputs.field3, }; if (objHasNullValue(fields)) { goToPage(PAGES.INTRODUCTION); } };
因為我只關心指定的鍵,所以多次調用getState()
。 app
還有很多其他我不需要的東西。
// parsing.js export const objHasNullValue = obj => { for (var property in obj) { if (isNull(obj[property]) === true) { return true; } } return false; };
goToPage
是不言自明的。
// action.test.js describe('redirect to intro page', () => { let sandbox, fakeDispatch, fakeState, goToPage; const fakeGetState = () => (fakeState); beforeEach(() => { sandbox = sinon.createSandbox(); fakeDispatch = sandbox.stub(); goToPage = sandbox.spy(); }); afterEach(() => { sandbox.restore(); }); it('should redirect if the Personalisation Form has a null value', () => { fakeState = { app: { inputs: { field1: null, field2: null, field3: null, }, }, }; redirectToIntroPage()(fakeDispatch, fakeGetState); expect(goToPage.calledOnce).toBe(true); }); it('shouldn\\'t redirect if the Personalisation Form is complete', () => { }); });
我對測試的想法是將goToPage
存根並檢查它是否已被調用。 redirectToIntroPage()(fakeDispatch, fakeGetState)
我必須調用redirectToIntroPage()(fakeDispatch, fakeGetState)
,但是如何在redirectToIntroPage
內部獲取檢查goToPage
呢?
我在這里看過,從概念上講是有意義的,但是如何在Sinon和Jest中翻譯呢?
我也看過這里 ,這是相同的想法。
從參數而不是從外部范圍獲取goToPage
(因為很難模擬)。 將您的功能分為2:
// Use for testing
export const redirectTo = (goToPage) => () => (dispatch, getState) => {
const fields = {
field1: getState().app.inputs.field1,
field2: getState().app.inputs.field2,
field3: getState().app.inputs.field3,
};
if (objHasNullValue(fields)) {
goToPage(PAGES.INTRODUCTION);
}
};
// Use as before
export const redirectToIntroPage = redirectTo(goToPage);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.