React-dnd: React TestUtils๊ฐ€ ์•„๋‹Œ Enzyme์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

์— ๋งŒ๋“  2017๋…„ 11์›” 26์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: react-dnd/react-dnd

์ด ๋ฌธ์„œ ์™€ ์ด ๋ฌธ์ œ https://github.com/react-dnd/react-dnd/issues/453์— ๋”ฐ๋ผ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ œ๋Š” ํ…Œ์ŠคํŠธ ๋ Œ๋”๋ง์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DragDropContext์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ž˜ํ•‘ํ•˜๊ณ  TestUtils.renderIntoDocument ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

DragDropContextContainer ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Enyzme mount ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด๋ฅผ ๋ Œ๋”๋งํ•˜๋ ค๊ณ  ํ•˜๋ฉด $$typeof: Symbol(react.element) ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๊ด€๋ฆฌ์ž๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Enzyme์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์—์„œ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์ด๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋„์›€์„ ๋ฐ›์•˜์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. wrapper.instance() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ์—ฌ๋Ÿฌ๋ถ„์ด ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. https://github.com/react-dnd/react-dnd/issues/488 ์—๋„ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค

์˜ˆ

const Context = wrapInTestContext(Component)
const wrapper = mount(<Context />)
const manager = wrapper.instance().getManager()
const backend = manager.getBackend()

๋˜ํ•œ getHandlerId() ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ธ์Šคํ„ด์Šค๋„ ๊ฐ€์ ธ์™€์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋œ๋‹ค๋ฉด ์—ฌ๊ธฐ ๋‚ด ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://gist.github.com/gilleswittenberg/142fe49e1115b5a1936562b2284e1ab7

๋ชจ๋“  3 ๋Œ“๊ธ€

๋ฐฉ๊ธˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ์—์„œ.

import { ThingIAmTesting } from '../file/where/it/lives';
describe('It is a test!', () => {
  let props;
  let component;
  const getComponent = () => {
    let OriginalComponent = (ThingIAmTesting as any).DecoratedComponent;
    let identity = el => el;
    if (!component) {
      component = Enzyme.shallow(
        <OriginalComponent {...props} connectDragSource={identity} />
       );
      return component
    }

    beforeEach (() => {
      props = {
         prop: 'stuff',
         }
      component = undefined;
     })
    it('should render', () => {
      let component = getComponent();
      expect(component).toMatchSnapshot();
    });
})

์ด ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. wrapper.instance() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ์—ฌ๋Ÿฌ๋ถ„์ด ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. https://github.com/react-dnd/react-dnd/issues/488 ์—๋„ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค

์˜ˆ

const Context = wrapInTestContext(Component)
const wrapper = mount(<Context />)
const manager = wrapper.instance().getManager()
const backend = manager.getBackend()

๋˜ํ•œ getHandlerId() ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ธ์Šคํ„ด์Šค๋„ ๊ฐ€์ ธ์™€์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋œ๋‹ค๋ฉด ์—ฌ๊ธฐ ๋‚ด ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://gist.github.com/gilleswittenberg/142fe49e1115b5a1936562b2284e1ab7

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ™œ๋™์ด ์—†์œผ๋ฉด ํ์‡„๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰