Jsdom: HTML5 양식 μœ νš¨μ„± 검사

에 λ§Œλ“  2012λ…„ 12μ›” 14일  Β·  9μ½”λ©˜νŠΈ  Β·  좜처: jsdom/jsdom

JSDOM은 ν˜„μž¬ HTML5 양식 μœ νš¨μ„± 검사, 특히 checkValidity APIλ₯Ό μ²˜λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이것은 HTML5 양식을 μ‚¬μš©ν•˜λŠ” μ΅œμ‹  μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ •ν™•ν•˜κ²Œ ν…ŒμŠ€νŠΈν•˜λŠ” 데 ν•„μš”ν•©λ‹ˆλ‹€.

http://www.thecssninja.com/javascript/h5f λ₯Ό μ‹œμž‘μ μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ 이 지원을 μΆ”κ°€ν•  수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. H5FλŠ” HTML5 양식 지원을 μ§€μ›ν•˜μ§€ μ•ŠλŠ” λΈŒλΌμš°μ €μ— μΆ”κ°€ν•˜κΈ° μœ„ν•œ λΈŒλΌμš°μ € shimμž…λ‹ˆλ‹€. μ œμ³λ‘κ³ , λˆ„κ΅°κ°€κ°€ λ‚˜μ—κ²Œ κ°€μž₯ 쒋은 방법을 μ•Œλ €μ€„ 수 μžˆλ‹€λ©΄ 이 λ™μž‘μ„ 직접 μΆ”κ°€ν•  수 μžˆμ–΄ κΈ°μ©λ‹ˆλ‹€.

feature html living standard needs tests

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

:+1: ν›Œλ₯­ν•œ κΈ°λŠ₯이 될 κ²ƒμž…λ‹ˆλ‹€.

λͺ¨λ“  9 λŒ“κΈ€

λ‚˜λŠ” 이것이 ν›Œλ₯­ν•˜κ³  μ€‘μš”ν•  κ²ƒμ΄λΌλŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것은 κ½€ 일이 될 κ²ƒμž…λ‹ˆλ‹€.

여기에 ν•„μš”ν•œ κ°€μž₯ 큰 것은 κ²¬κ³ ν•œ ν…ŒμŠ€νŠΈ λͺ¨μŒμž…λ‹ˆλ‹€. Contributing.md κ°€μ΄λ“œλΌμΈμ„ 보면 μ–΄λ””μ„œ 찾을 수 μžˆλŠ”μ§€, μ•„λ‹ˆλ©΄ 찾을 수 μ—†λŠ”μ§€, μ–΄λ–€ 메일링 λ¦¬μŠ€νŠΈμ— 물어봐야 ν•˜λŠ”μ§€μ— λŒ€ν•œ λͺ‡ 가지 지침이 μžˆμŠ΅λ‹ˆλ‹€. νŒŒν—€μΉ  수 μžˆλ‹€λ©΄ 특히 H5Fλ₯Ό μ‹œμž‘μ μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ μ§€μ ν•œ κ²ƒμ²˜λŸΌ 이λ₯Ό κ΅¬ν˜„ν•  κΈ°νšŒκ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μ‹€μ œ κ΅¬ν˜„μ—μ„œ μœ μΌν•˜κ²Œ λ‹€λ₯Έ μ€‘μš”ν•œ 뢀뢄은 DOM 레벨 3 이상을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ μ μ ˆν•œ "level4" λ˜λŠ” "html5" 폴더가 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것은 μž μ‹œ λ™μ•ˆ ν•„μš”ν–ˆκΈ° λ•Œλ¬Έμ— μ‹œλ„ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. 빨리 μ‹œμž‘ν•˜κΈ° μœ„ν•΄.

:+1: ν›Œλ₯­ν•œ κΈ°λŠ₯이 될 κ²ƒμž…λ‹ˆλ‹€.

μ§€κΈˆμ€ jsdom μ„€μ • ν›„ ν΄λ¦¬ν•„λ‘œ https://github.com/hyperform/hyperform 을 μΆ”κ°€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 그것은 잘 μž‘λ™ν•©λ‹ˆλ‹€.

μ•Ό! μ €λŠ” Hyperform의 μ €μžμž…λ‹ˆλ‹€. 그리고 운이 μ’‹μœΌλ©΄ 이미 JSDom을 μ‚¬μš© ν•˜μ—¬ ν…ŒμŠ€νŠΈ ν™˜κ²½μ„ μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€ .

JSDom κ΄€λ¦¬μžμ—κ²Œ ν₯미둜울 수 μžˆλŠ” λΆ€λΆ„: μ μ ˆν•œ μ›Ή ν”Œλž«νΌ ν…ŒμŠ€νŠΈλ₯Ό 닀루기 μœ„ν•΄ JSDom λ‚΄λΆ€μ—μ„œλ„ Hyperform을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

$ git diff test/web-platform-tests/create-jsdom.js
diff --git a/test/web-platform-tests/create-jsdom.js b/test/web-platform-tests/create-jsdom.js
index 7009df7..9edcb16 100644
--- a/test/web-platform-tests/create-jsdom.js
+++ b/test/web-platform-tests/create-jsdom.js
@@ -1,5 +1,6 @@
 "use strict";
 const jsdom = require("../..");
+const hyperform = require("hyperform");
 const nodeResolverPromise = require("../util").nodeResolverPromise;

 const globalPool = { maxSockets: 6 };
@@ -35,6 +36,9 @@ module.exports = (urlPrefix, testPath) => {

   return created
   .then(window => {
+    global.window = window;
+    global.document = window.document;
+    hyperform(window);
     return new Promise((resolve, reject) => {
       const errors = [];

test/web-platform-tests/index.js μ—μ„œ "html/semantics/forms/constraints/*.html" ν…ŒμŠ€νŠΈμ˜ 주석을 μ œκ±°ν•©λ‹ˆλ‹€.

λΆˆν–‰νžˆλ„ λ‚˜λŠ” λ…Ήμƒ‰μœΌλ‘œ λ³€ν•˜λŠ” λͺ‡ 가지 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 만 가지고 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ (μ–΄λ–€ μ‹μœΌλ‘œλ“ ) Hyperform의 κΈ°λŠ₯을 JSDom에 μΆ”κ°€ν•˜λŠ” 데 관심이 μžˆλ‹€λ©΄

) ν•΄λ‹Ή ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜κ³ 
b) μƒμœ„ μˆ˜μ€€ API λ₯Ό μ œμ™Έν•˜λŠ” 버전 λ˜λŠ” ꡬ성을 Hyperform에 제곡

FWIW, λ‚˜λŠ” 이것에 κ½€ 관심이 μžˆμŠ΅λ‹ˆλ‹€. μ €λŠ” JSON μŠ€ν‚€λ§ˆλ₯Ό 기반으둜 양식을 λ Œλ”λ§ν•˜λŠ” Vue ꡬ성 μš”μ†Œμ—μ„œ μž‘μ—… 쀑이며 Validity API에 μ˜μ‘΄ν•˜μ—¬ 제좜 μ‹œ μœ νš¨μ„± 검사 μƒνƒœλ₯Ό μ‚°μΆœν•©λ‹ˆλ‹€. λ‚΄ λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” Jest(ν›„λ“œμ—μ„œ JSDOM μ‚¬μš©)둜 μ‹€ν–‰λ˜μ—ˆμœΌλ©° ν˜„μž¬λ‘œμ„œλŠ” 이 뢀뢄을 ν…ŒμŠ€νŠΈν•  수 μ—†μŠ΅λ‹ˆλ‹€.

@Boldewyn 제 κ²½μš°μ™€ κ΄€λ ¨ν•˜μ—¬ μ œμ•ˆ 사항이 있으면 기꺼이 μˆ˜λ½ν•˜κ² μŠ΅λ‹ˆλ‹€. μ‹œμž‘ν•˜λŠ” 데 λͺ‡ 가지 지침이 μ œκ³΅λ˜λŠ” 경우 이λ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 도움을 쀄 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. :)

νŽΈμ§‘ : μ•„λž˜μ—μ„œ @EricHenry 의 μ†”λ£¨μ…˜μ„ μ‚¬μš©ν–ˆλŠ”λ° μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€. HTMLInputElement , HTMLSelectElement 및 HTMLTextAreaElement 에도 checkValidity λ₯Ό μ„€μ •ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€ HTMLFormElement ). 건배!

Jest 및 Enzyme을 μ‚¬μš©ν•˜μ—¬ React ꡬ성 μš”μ†Œλ₯Ό ν…ŒμŠ€νŠΈν•  λ•Œ 이 λ¬Έμ œκ°€ μžˆλŠ” μ‚¬λžŒμ„ μœ„ν•΄ μœ„μ—μ„œ @fernandopasik 및 @Boldewyn 이 μ–ΈκΈ‰ν•œ ν•˜μ΄νΌνΌ νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜μ—¬ JSDOM 을 폴리필할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ νŒŒμΌμ—μ„œ ν•˜μ΄νΌνΌμ„ μ„€μΉ˜ν•œ ν›„ λ‹€μŒμ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

import * as hyperform from 'hyperform';

var global = global;

const defineValidity = {
  get() {
    return hyperform.ValidityState(this);
  },
  configurable: true
};

global.HTMLFormElement.prototype.checkValidity = function() {
  return hyperform.checkValidity(this);
};

Object.defineProperty(global.HTMLFormElement.prototype, 'validity', defineValidity);
Object.defineProperty(global.HTMLInputElement.prototype, 'validity', defineValidity);
Object.defineProperty(global.HTMLSelectElement.prototype, 'validity', defineValidity);
Object.defineProperty(global.HTMLTextAreaElement.prototype, 'validity', defineValidity);

μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” λ‹€λ₯Έ HTMLElement λ˜λŠ” 폴리필에 ν•„μš”ν•œ λ‹€λ₯Έ 속성에 λŒ€ν•΄ λ™μΌν•œ 방법을 λ”°λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

PR #2142λŠ” 폴리필 없이 전체 μ œμ•½ 쑰건 APIλ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.

Jest λ¬Έμ„œλŠ” JSDOMμ—μ„œ κ΅¬ν˜„λ˜μ§€ μ•Šμ€ λͺ¨μ˜ 방법을 μ œμ•ˆν•©λ‹ˆλ‹€. ν…ŒμŠ€νŠΈλ‘œ 인해 ν™˜κ²½μ„ μ˜€μ—Όμ‹œν‚€λŠ” 것보닀 이것이 더 κΉ¨λ—ν•œ μ†”λ£¨μ…˜μ΄λΌκ³  μƒκ°ν•©λ‹ˆλ‹€.

제 κ²½μš°μ—λŠ” μ–‘μ‹μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•œ λ‹€μŒ μ–‘μ‹μ˜ classList μ—μ„œ νŠΉμ • ν΄λž˜μŠ€κ°€ μžˆλŠ”μ§€ 검사해야 ν–ˆμŠ΅λ‹ˆλ‹€. 이 ν΄λž˜μŠ€κ°€ 있으면 μ–‘μ‹μ˜ μœ νš¨μ„±μ— λŒ€ν•΄ μ•Œλ €μ€λ‹ˆλ‹€.

λ‚΄ μ†”λ£¨μ…˜μ€ μ–‘μ‹μ˜ 속성을 μ‘°λ‘±ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ classList DOMTokenList 의 κΈ°λ³Έ κ΅¬ν˜„μ„ μ‘°λ‘±ν–ˆμŠ΅λ‹ˆλ‹€.

beforeAll(() => {
    window.DOMTokenList = jest.fn().mockImplementation(() => {
        return {
            list: [],
            remove: jest.fn().mockImplementation(function (item) {
                const idx = this.list.indexOf(item);

                if (idx > -1) {
                    this.list.splice(idx, 1)
                }
            }),
            add: jest.fn().mockImplementation(function (item) {
                this.list.push(item);
            }),
            contains: jest.fn().mockImplementation(function (item) {
                return this.list.indexOf(item) > -1;
            })
        };
    });
})

그런 λ‹€μŒ 이벀트 ν•Έλ“€λŸ¬μ— 속성을 μ „λ‹¬ν•˜λŠ” 데 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. event.currentTarget.form λ₯Ό μ‚¬μš©ν•˜μ—¬ 제좜 λ²„νŠΌμ—μ„œ λ°˜μ‘ ꡬ성 μš”μ†Œμ˜ 양식에 μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

let mockClassList = new DOMTokenList();

submitBtn.simulate('click', {
        currentTarget: {
            form: {
                checkValidity: () => false,
                classList: mockClassList
            }
        },
        preventDefault: jest.fn(),
        stopPropagation: jest.fn()
    })

이λ₯Ό 톡해 μ–‘μ‹μ˜ μœ νš¨μ„±μ„ false 및 true둜 μ„€μ •ν•˜κ³  맀번 was-validated ν΄λž˜μŠ€κ°€ μžˆλŠ”μ§€ mockClassList λ₯Ό 검사할 수 μžˆμŠ΅λ‹ˆλ‹€.

    submitBtn.simulate('click', {
        currentTarget: {
            form: {
                checkValidity: () => false,
                classList: mockClassList
            }
        },
        preventDefault: jest.fn(),
        stopPropagation: jest.fn()
    });

    expect(mockClassList.contains('was-validated')).toBeTruthy();

    submitBtn.simulate('click', {
        currentTarget: {
            form: {
                checkValidity: () => true,
                classList: mockClassList
            }
        },
        preventDefault: jest.fn(),
        stopPropagation: jest.fn()
    });

    expect(mockClassList.contains('was-validated')).toBeFalsy();

μ°Έκ³ : μ €λŠ” 이λ₯Ό μœ„ν•΄ Enzyme의 얕은 λ Œλ”λ§μ„ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ§ˆμš΄νŠΈκ°€ 이 μ†”λ£¨μ…˜μ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ JSDOMμ—μ„œ κ΅¬ν˜„λ˜μ§€ μ•Šμ€ λͺ¨μ˜ λ©”μ„œλ“œμ— λŒ€ν•œ λ‹€λ₯Έ μ œμ•ˆμ€ ν…ŒμŠ€νŠΈλœ 파일 λ¬Έμ—μ„œ λ©”μ„œλ“œκ°€ 직접 싀행될 λ•Œ 마운트 λ Œλ”λ§κ³Ό ν•¨κ»˜ μž‘λ™ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜λŠ” κ²½ν–₯이 μžˆμŠ΅λ‹ˆλ‹€.

j [email protected] μ—μ„œ μ‚¬μš©ν•  수 μ—†λŠ” input.validity 에 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

// EditableInput.js:
this.inputElement = React.createRef();
...
const input = this.inputElement.current;
console.error('input.validity: ', input.validity);
// EditableInput.test.js run outcome:
    console.error src/components/Form/Input/EditableInput.js:47
      input.validity:  undefined
// yarn.lock:
jsdom@^11.5.1:
  version "11.12.0"
  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8"
  integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==

μœ νš¨μ„± μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆλŠ” PR이 λ³‘ν•©λœ λ‚  λ¦΄λ¦¬μŠ€λ˜μ—ˆμœΌλ―€λ‘œ μˆ˜μ •ν–ˆμ–΄μ•Ό ν•˜λŠ” 버전이 11.8.0μž„μ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ λ­”κ°€λ₯Ό λ†“μΉ˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰