簡體   English   中英

在另一個函數內部已調用了如何測試一個函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM