Upgrade to Pro — share decks privately, control downloads, hide ads and more …

unittest-frontend

 unittest-frontend

https://yahoo-nagoya.connpass.com/event/137228/
ヤフー名古屋 Tech Meetup #3 - Webフロントエンドを支えるノウハウにて、登壇に使ったスライドです。

同じものをslides.comで公開していましたが一時的に不調のため、こちらにもアップしました。

Avatar for ringtail003

ringtail003

August 06, 2019

Other Decks in Programming

Transcript

  1. https://tech.quartetcom.co.jp/ גࣜձࣾΧϧςοτίϛϡχέʔγϣϯζͰ ಇ͍͍ͯ·͢ https://qiita.com • Sinon.JS ͰςετμϒϧΛཧղ͢Δ • Angular ίϯϙʔωϯτͷςετ

    • एऀΑϑϩϯτΤϯυΤϯδχΞΛ໨ࢦ͢ͳΒ୤K2VFSZΛ͠Α͏ • ͦͷίʔυɺ։ൃ؀ڥͱҟͳΔϒϥ΢βͰ΋ಈ࡞͠·͔͢ʁ @ringtail003 দԬ΍Α͍ 2
  2. it (‘HTTP200ͷ࣌͸ݕࡧ݁ՌΛϦετදࣔ’, …); it (‘࠶ݕࡧ͕Ͱ͖Δ’, …); it (‘HTTP200ɺ2ճ໨͸HTTP400’, …); it

    (‘HTTP400ɺ2ճ໨͸HTTP500’, …); it (‘HTTP500ͷ࣌͸Τϥʔදࣔ’, …); it (‘HTTP200Ҏ֎Ͱ΋࠶ݕࡧͰ͖Δ’, …); it (‘HTTP403ͩͬͨΒ࠶ݕࡧͰ͖ͳ͍’, …); it (‘ݕࡧத͸ݕࡧΞΠίϯ͕͘Δ͘ΔճΔ’, …); … ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 8
  3. it (‘HTTP200ͷ࣌͸ݕࡧ݁ՌΛϦετදࣔ’, …); it (‘࠶ݕࡧ͕Ͱ͖Δ’, …); it (‘HTTP200ɺ2ճ໨͸HTTP400’, …); it

    (‘HTTP400ɺ2ճ໨͸HTTP500’, …); it (‘HTTP500ͷ࣌͸Τϥʔදࣔ’, …); it (‘HTTP200Ҏ֎Ͱ΋࠶ݕࡧͰ͖Δ’, …); it (‘HTTP403ͩͬͨΒ࠶ݕࡧͰ͖ͳ͍’, …); it (‘ݕࡧத͸ݕࡧΞΠίϯ͕͘Δ͘ΔճΔ’, …); Ͳ͜ʹςετॻ͘ʁʁʁ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 10
  4. View Model ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ Controller

    ϨϯμϦϯά݁Ռ 12 ϏδωεϩδοΫ HTML ৼΔ෣͍ Action Data bind
  5. it (‘HTTP500ͷ࣌’, () => { const SUT = new ComponentController(’foo’);

    … expect(SUT.hasError()).toBe(false)); }); it (‘HTTP200ͷ࣌’, () => { const SUT = compile(’<foo></foo>’); … expect(SUT.find(‘.error’).length).toBe(false)); }); HTTP500ͳΞΠίϯ͕ςετͰ͖ͳ͍ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 13
  6. 400 403 400 403 200 400 403 200 400 403

    γφϦΦͷύε͸͜Μͳʹͨ͘͞Μ ࠶ݕࡧ 200 ݕࡧ ࠶ݕࡧ ࠶ݕࡧ 200 ςετ͕͋Δ෦෼ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 14
  7. ΞΠςϜબ୒ อଘ ΧΦεͳςετ͕Ͱ͖͕͋Δ ΫϦΞ ݕࡧ ࠶ݕࡧ Ωϟϯηϧ ੒ޭ Τϥʔ ݕࡧ

    ίϯτϩʔϥͷςετ ϨϯμϦϯά݁Ռͷςετ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 17
  8. ͦͷ̍ʣશύλʔϯ໢ཏ͸ແཧ 400 403 200 400 403 200 400 403 ࠶ݕࡧ

    200 1εςʔτʹண໨͠Α͏ 403 ࠶ݕࡧ 200 ࠶ݕࡧ 400 ݕࡧ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 25
  9. ͦͷ̏ʣ੔ཧ੔಴ ΞΠςϜબ୒ อଘ ΫϦΞ ݕࡧ ࠶ݕࡧ Ωϟϯηϧ ΞΠςϜબ୒ อଘ ΫϦΞ

    ݕࡧ Ωϟϯηϧ search .spec.js clear .spec.js items .spec.js save .spec.js cancel .spec.js ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ ద౓ʹ෼ׂ͠Α͏ 29
  10. describe (‘ݕࡧ’, () => { function setup { … }

    function assert { … } it (‘ύλʔϯ1’, () => { … } it (‘ύλʔϯ2’, () => { … } … }); ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 32
  11. describe (‘ݕࡧ’, () => { function setup { … }

    function assert { … } it (‘ύλʔϯ1’, () => { … } it (‘ύλʔϯ2’, () => { … } … }); ؀ڥ࡞Γ୲౰ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 33
  12. describe (‘ݕࡧ’, () => { function setup { … }

    function assert { … } it (‘ύλʔϯ1’, () => { … } it (‘ύλʔϯ2’, () => { … } … }); ݕূ୲౰ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 34
  13. describe (‘ݕࡧ’, () => { function setup { … }

    function assert { … } it (‘ύλʔϯ1’, () => { … } it (‘ύλʔϯ2’, () => { … } … }); ྻڍ୲౰ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 35
  14. function setup () => { spyOn( fooService ); const SUT

    = compile( ’<foo></foo>’ ); return SUT; } ϞοΫ ίϯύΠϧ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 36 ؀ڥ࡞Γ୲౰✋
  15. function assert ( params, expected ) => { const SUT

    = setup(); SUT.find(‘button’).click(); fooService.return( params.foo ); expect(fooService.called).toBe( expected.called )); expect(SUT.find(‘foo’).length).toBe( expected.length )); } γφϦΦ ݕূ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 37 ݕূ୲౰✋
  16. it (‘࣮਺ͷ࣌’, () => { assert( { foo: 1 },

    { called: true, … } ); } it (‘nullͷ࣌’, () => { assert( { foo: null }, { called: false, … } ); } ύλʔϯ ύλʔϯ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 38 ྻڍ୲౰✋
  17. function setup { … } function assert { … }

    it (‘ύλʔϯ1’, () => { … } it (‘ύλʔϯ2’, () => { … } … ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 40 ᶃςετΛ୳͢ ᶄγφϦΦΛཧղ ᶅύλʔϯΛ଍͢ ςετΛ௥Ճ͢Δ࣌ search.spec.js
  18. it (’foo-component’, () => { const SUT = compile(’<foo></foo>’); expect(SUT).toBeTruthy();

    }); ੜଘ֬ೝ୲౰ ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ ͓ΘΓʹ ʼ 42
  19. ϞοΫͷϧʔϧ search.spec.js list.spec.js smork-test.spec.js tests ͳͥΧΦεʹͳΔͷ͔ վળͷώϯτ ʼ վળޙͷίʔυ ʼ

    ͓ΘΓʹ ʼ 44 smork-test.spec.js Ϣχοτςετ εϞʔΫςετ ϞοΫΛ࢖͏ ࣮ମΛ࢖͏