✒️
Notes
  • Lirenxn's daily notes
  • Featured
    • Concurrent on fiber and requestIdleCallback
    • Deep dive eslint
      • eslint with class property
      • eslint with fix
      • eslint with jsx
    • A opinioned intro to React Hooks
      • React Hooks 1 - An Overview
      • React Hooks 2 - A mindset change
      • React Hooks 3 - Test Hooks
    • Handy tricks
    • About Micro FrontEnd
    • Same-site cookie
    • Thoughts
      • Application Security for frontend OWASP
      • Javascript this
      • React validation
  • 2020 Daily Notes
    • Notes-04-05-eslint-and-babel
    • Notes-04-03-Hard-interview-question
    • Notes-03-31-ReactContext-JS-inherit
    • Notes-03-28-digital-signing-webpack-dynamic-import-JsonRest-Promise-pattern-performance.measure()
    • Wk-notes-03-16-i18n-solution
    • Notes-03-15-Concurrent-with-requestIdleCallback
    • Notes-03-15-Micro-frontend
    • Wk-notes-03-09-micro-frontend-bootstrapper
    • Wk-notes-02-27-API-design-(g)RPC-REST-etc
    • Wk-notes-02-26-React-form-validation-Boolean-algebra-Rule-for-this-App-security-npm-devtool-tricks
    • Wk-notes-02-18-i18n-gRPC
    • Wk-notes-02-11-Gradual-rollout-webpack-vscode-auto-import
    • Note-02-09-spring-webpack
    • Wk-notes-02-06-more-webpack
    • Wk-notes-02-05-Learn-spring-webpack
    • Wk-notes-02-04-props-drilling-virtual-list
    • Wk-notes-02-03-same-site-cookie
    • Wk-notes-01-31-g-recaptcha-npmshrinkwrap
    • Wk-notes-01-30-React-ref
    • Wk-notes-01-23-remote-android
    • Wk-notes-01-23-test-hook
    • Wk-notes-01-22-about-Hooks
    • Wk-notes-01-17-bundling-browser-module-treeshake-2
    • Wk-notes-01-16-Bundling-Treeshaking-1
    • Wk-notes-01-13-npm-script-css-scroll
    • Wk-notes-01-13-touchscreen-hover-and-apis
    • Wk-notes-01-13-emotion-x
    • Wk-notes-01-10-codemod
    • Wk-notes-01-08-live-region-react-test-lib
    • Wk-notes-01-06-eslint-finalise
  • 2019 Daily Notes
    • Wk-notes-12-11-eslint-dive-vscode-debug
    • Wk-notes-12-10-eslint-dive
    • Wk-notes-12-6-splunk
    • Wk-notes-12-3-react-function-memo
    • Wk-notes-12-2-agile-test-micro-frontend
    • Wk-notes-11-29-npm-fix-aem-datalayer-test
    • Wk-notes-11-28-adobe-dataLayer
    • Wk-notes-11-27-a11y
    • Wk-notes-11-25-upgrade-preact
    • Wk-notes-11-22-a11y-n-voice-over
    • Wk-notes-11-21-Add-Typescript
    • Wk-notes-11-20-JSDoc
    • Wk-notes-11-19-A11y-Polyfill
    • Wk-notes-11-18-jest-mock
    • Wk-notes-11-15-React-Portal
    • Wk-notes-11-14-iOS-simulator-git-hooks-All-hands-testing
    • Wk-notes-11-13-i18n
    • Wk-notes-11-12-safari-remote-debug
    • Wk-notes-11-11-migrating-typescript-git-remote-label-Emotion-controlled-component
    • Wk-notes-11-08-living-pricing-arch
    • Wk-notes-11-07-vitual-box-n-onblur-for-div
    • Wk-notes-11-06-bug-race-virtual-dom-diff
    • Wk-notes-11-05-babel-loader-eslint
Powered by GitBook
On this page
  • Bugs from analytic tools
  • Test React Hooks
  • A practice from downshiftjs

Was this helpful?

  1. 2020 Daily Notes

Wk-notes-01-23-test-hook

Bugs from analytic tools

There could be bugs triggered from other lib, like analytics tool glass box. Do NOT spend too much time on it.

Test React Hooks

I invested some time into hooks recently, this is sth I want to share: People says, for custom hooks, it can extract same functionality out as composable logic, so that the logic is more maintainable and testable,but then I found to test it, you will always need to create and mount a Component over it, because hooks behavior happens ONLY in react component in the vdom. I would say it is testable, but still a bit painful.

So here are 2 snippets I found that can be a conventions we used to test a custom hook:

I. With Customed Component, and simply get things from wrapper.prop

it('get same value when using `useMemo` and rerender with same prop in dependencies', () => {
      function Child() {
        return false;
      }
      function ComponentUsingMemoHook(props) {
        const { count } = props;
        const memoized = useMemo(() => ({ result: count * 2 }), [count]);
        return (
          <Child memoized={memoized} />
        );
      }
      const wrapper = mount(<ComponentUsingMemoHook count={1} />);
      const initialValue = wrapper.find(Child).prop('memoized');
      wrapper.setProps({ unRelatedProp: '123' });
      const nextValue = wrapper.find(Child).prop('memoized');
      expect(initialValue).to.equal(nextValue);
    });
    it('get different value when using `useMemo` and rerender with different prop in dependencies', () => {
      function Child() {
        return false;
      }
      function ComponentUsingMemoHook(props) {
        const { count, relatedProp } = props;
        const memoized = useMemo(() => ({ result: count * 2 }), [count, relatedProp]);
        return (
          <Child memoized={memoized} relatedProp={relatedProp} />
        );
      }
      const wrapper = mount(<ComponentUsingMemoHook relatedProp="456" count={1} />);
      const initialValue = wrapper.find(Child).prop('memoized');
      wrapper.setProps({ relatedProp: '123' });
      const nextValue = wrapper.find(Child).prop('memoized');
      expect(initialValue).to.not.equal(nextValue);
    });
  });   
});

II. Use react-test-hooks lib

const { result } = renderHook(() => useTime(100));       expect(result.current).toBe('mockNow');

A practice from downshiftjs

  • Get a folder/file structure for each complex hook

  • Use a testUtil to set up rendering a test component (as always)

  • Focus on testing hooks funtionality in test.spec.js

PreviousWk-notes-01-23-remote-androidNextWk-notes-01-22-about-Hooks

Last updated 5 years ago

Was this helpful?

Ref :

Ref :

Ref : ,

https://github.com/airbnb/enzyme/pull/2144/files#diff-fadeaaf857f5b3fe6522e89a63ca9a41
https://www.newline.co/@jamesfulford/testing-custom-react-hooks-with-jest--8372a502
https://github.com/downshift-js/downshift/blob/v4.0.8/src/hooks/useSelect/testUtils.js
https://github.com/downshift-js/downshift/blob/v4.0.8/src/hooks/useSelect/__tests__/getLabelProps.test.js