1ã€ã®it
ã«è€æ°ã®æåŸ
å€ãããå ŽåãçŸåšãã³ãŒãå
ã®è¡çªå·ã§å€±æãçžäºåç
§ããã«ãå®éã«å€±æããæåŸ
å€ãç¹å®ããããšã¯äžå¯èœã®ããã§ãã
test('api works', () => {
expect(api()).toEqual([]) // api without magic provides no items
expect(api(0)).toEqual([]) // api with zero magic also provides no items
expect(api(true)).toEqual([1,2,3]) // api with magic enabled provides all items
})
ã©ã®æåŸ ã倱æããŸãããïŒ æåã2çªç®ïŒ
ã¹ã¿ãã¯ãã¬ãŒã¹ã®äžçªäžã«ããè¡çªå·ãèŠã€ããŠãããã³ãŒãã
以äžã®tape
çžåœã®ãã®ãæ¯èŒããŠãã ããã æåã®ã¢ãµãŒã·ã§ã³ã倱æããåŸãããŒãããã€ã«ããªãããšãç¡èŠããŸãã tape
ã¯ãåæåŸ
倱æã®äžã«äººéãèªããã¡ãã»ãŒãžãåºåãããã¹ããã¡ã€ã«ã«æ»ããã«ã©ã®ãã¹ãã倱æããããæ£ç¢ºã«ç¥ãããšãã§ããŸãã
ããã«ããã人éãèªã¿åãããã€ãºããã¹ããœãŒã¹ã®è¡æ«ãŸã§ããã·ã¥ãããã³ã¡ã³ããæžã蟌ãå¯èœæ§ãããããšã«æ³šæããŠãã ããã
test('api works', t => {
t.deepEquals(api(), [], 'api without magic provides no items')
t.deepEquals(api(0), [], 'api with zero magic also provides no items')
t.deepEquals(api(true), [1,2,3], 'api with magic enabled provides all items')
})
jest
ã®ãšã©ãŒã«äººéãèªããæ
å ±ãæ·»ä»ããå¯äžã®æ¹æ³ã¯ããã¹ãŠãè¿œå ã®it
ã§ã©ããããããšã§ããããã¯ãäžå¿
èŠã«åé·ãªIMOã§ãã
describe('api works', () => {
test('api without magic provides no items', () => {
expect(api()).toEqual([])
})
test('api with zero magic also provides no items', () => {
expect(api(0)).toEqual([])
})
test('api with magic enabled provides all items', () => {
expect(api(true)).toEqual([1,2,3])
})
})
çæ³çã«ã¯ã人éãèªãã圢åŒã®ã³ã³ããã¹ããexpect
ã®æ«å°Ÿã«ãªãããã®æ¹æ³ã§æ·»ä»ã§ããŸãã
äŸãã°
ã¢ãµãŒã·ã§ã³ã¡ãœããã®è¿œå ãªãã·ã§ã³ãã©ã¡ãŒã¿ãšããŠã®ã³ã³ããã¹ãã¡ãã»ãŒãžïŒ
test('api works', () => {
expect(api()).toEqual([], 'api without magic provides no items')
expect(api(0)).toEqual([], 'api with zero magic provides no items')
expect(api(true)).toEqual([1,2,3], 'api with magic enabled provides all items')
})
ãŸãã¯ãé£éãã.because
ãŸãã¯.why
ãŸãã¯.comment
ãŸãã¯.t
ãªã©ã®ã³ã³ããã¹ãã¡ãã»ãŒãžïŒ
test('api works', () => {
expect(api()).toEqual([]).because('api without magic provides no items')
expect(api(0)).toEqual([]).because('api with zero magic provides no items')
expect(api(true)).toEqual([1,2,3]).because('api with magic enabled provides all items')
})
ãããã¯ãjestãåã«ãã¡ã€ã«ãèªã¿åã£ãŠãæåŸ å€èªäœãååšããå®éã®ãœãŒã¹ã³ãŒãè¡ãå°å·ã§ããã°ãããã«è¯ãã§ãããã
ããïŒ ãã®ãããå®éã«ã¯Jasmineã§ããã䜿çšããŠããŸããããFBã§æ°åãè¶ ãããã¹ããã¡ã€ã«ã䜿çšããŠãã人ã¯èª°ãããŸããã§ããã ãã®ãããä»ã®ãšãããããããã®æ å ±ãšæåŸ ã«ã€ãªããã¹ã¿ãã¯ãã¬ãŒã¹ãå«ãçŽ æŽããããšã©ãŒã¡ãã»ãŒãžãåºåããŠããŸãïŒã¹ã¯ãªãŒã³ã·ã§ããã®ããã«ïŒã ã¹ããŒããè¡ãå°å·ã§ããããšã«åæããŸãããã¢ãµãŒã·ã§ã³ã¯è€æ°è¡ã®é·ãã§ããããšããããããŸãã
expect(a).toEqual({
âŠ
});
ãããã£ãŠãããã¯å®éã«ã¯ããŸãèŠæ ãããããªããããŒãµãŒã䜿çšããŠJSã解æããé¢é£æ å ±ãæœåºããïŒãããŠé·ãè¡ãæããããïŒãªã©ããŠãèŠæ ããè¯ãããå¿ èŠããããŸãã
å人çã«ã¯ä»ã®ãšããååãªæ å ±ã瀺ããŠãããšæããŸãããåèãããŠããã ããŸãã ããã»ã©è€éã§ã¯ãªãããåé¡ãããè¿ éã«è§£æ±ºããã®ã«åœ¹ç«ã€ã³ã³ããã¹ããè¿œå ããã¢ã€ãã¢ãããå Žåã¯ããç¥ãããã ããã
ç§ãã¡ã¯å®éã«ããããžã£ã¹ãã³ã§æã£ãŠããŸããããFBã§äœåãã®ãã¹ããã¡ã€ã«ã䜿çšããŠãã人ã¯èª°ãããªãã£ãããšãããããŸãã
@cpojerãªã®ã§ããã¿ãŒã³ã¯åã¢ãµãŒã·ã§ã³ãit
ã§ã©ããããŸããïŒ ããã³/ãŸãã¯åã«è¡çªå·ãä¿¡é ŒããŸããïŒ
ãã®ãã¿ãŒã³ãè¯ããæªããæ¡çšãããŠããªãå¯èœæ§ã¯ãããŸãããæ¢åã®ãã¹ããšã®äžè²«æ§ã®ããã ãã«æ¡çšãããŠããã®ã§ããããã ãŸãã¯ããããæ©èœãååšããããšãç¥ããªãã®ã§ããïŒ ããããžã£ã¹ãã³ã«ãããšã¯ç¥ããŸããã§ããã
ã¹ããŒããè¡ãå°å·ã§ããããšã«åæããŸãããã¢ãµãŒã·ã§ã³ãè€æ°è¡ã®é·ãã§ããããšããããããŸã
1è¡ã«ãªãã¡ã¯ã¿ãªã³ã°ãããšãã¢ãµãŒã·ã§ã³ã§ããå€ãã®ã»ãã³ãã£ãã¯æ å ±ãä¿é²ãããå¯èœæ§ããããŸããïŒ å€åïŒ
const adminUser = {
âŠ
}
expect(a).toEqual(adminUser);
å人çã«ã¯ä»ã®ãšããååãªæ å ±ã瀺ããŠãããšæããŸãããåèãããŠããã ããŸã
äžèšã®äŸã¯ããã¹ãŠã«åé·ïŒIMOïŒã©ãããŒãè¿œå ããªãéããã©ã®ã¢ãµãŒã·ã§ã³ã倱æããããæ£ç¢ºã«æ€åºããã®ãé£ããããšã瀺ããŠããŸãã ããã¯ããœãŒã¹ãããã®è¡çªå·ãåžžã«æ£ç¢ºã§ãããšã¯éããªããã©ã³ã¹ãã€ã«ç°å¢ã§ç¹ã«åœãŠã¯ãŸããŸãã ç°¡æœãªãã¹ããšåæ§ã«ãè¿ éãã€æ£ç¢ºã«ç解ããããšãå£ããå ŽæãšéèŠãªå Žæã§ãããšç§ã¯ä¿¡ããŠããŸãã
ããã»ã©è€éã§ã¯ãªãããåé¡ãããè¿ éã«è§£æ±ºããã®ã«åœ¹ç«ã€ã³ã³ããã¹ããè¿œå ããã¢ã€ãã¢ãããå Žåã¯ããç¥ãããã ããã
ç§ã¯äžèšã®ããã€ãã®ææ¡ãããŸããïŒ
ãã£ãšã·ã³ãã«ãªãã®ããŸãã¯éããã®ããæ¢ãã§ããïŒ
ãã@timoxleyïŒ ç§ãã¡ã¯ãã§ã«ãã®ãããªãã®ãè¿œå ããããšãèããŠããŸããã
ãããã£ãŠãæåã®ãªãã·ã§ã³ã®åé¡ã¯ãäžéšã®ãããã£ãŒã«ãªãã·ã§ã³ã®åŒæ°ãããããããäºæ ãããè€éã«ããããšã§ãã
ããšãã°ã2çªç®ã®ã±ãŒã¹ã§ã¯ãåŒæ°ãè¿æ¥ã§ããããšã©ãŒã¡ãã»ãŒãžã§ãããã¯ããããŸããã
expect(555).toBeCloseTo(111, 2, 'reason why');
expect(555).toBeCloseTo(111, 'reason why');
äœããæåŸ ã«åããªããªããšããã«ãããã£ãŒãã¹ããŒããããã2çªç®ã®ææ¡ã¯æ©èœããŸãã
expect(1).toBe(2)/* will throw here */.because('reason');
次ã®ããã«ããããã£ãŒãå®è¡ãããåã«çç±ãæ·»ä»ã§ããŸãã
expect(1).because('reason').toBe(2);
// or
because('reason').expect(1).toBe(2);
ãããããã®APIã¯ããã»ã©èŠæ ãããããããŸããã
å¥ã®ãªãã·ã§ã³ã¯ã2çªç®ã®åŒæ°ãexpect
ã«è¿œå ããããšã§ãã
expect(1, 'just because').toBe(2);
ãã ããåã®ãªãã·ã§ã³ãšã»ãšãã©åãã§ãã
ãããããŸã圹ã«ç«ããªããšæãçç±ã¯ããšã³ãžãã¢ããã¹ããæžãã®ã«æéãç¡é§ã«ããããªãããã§ãã 圌ãã«ãšã£ãŠãããé£ãââãããããã«ç§ãã¡ãããããšã¯ããã ããæªããã¹ãã«ã€ãªããã§ãããã
以åã¯ãæåã®è§£æ±ºçã¯å®éã«ã¯ã«ã¹ã¿ã ãããã£ãŒãäœæããããšã§ããã 次ã®ããŒãžã§ã³ã®Jestã§expect.extend
ãå°å
¥ãããšã次ã®ãããªãããã£ãŒãç°¡åã«äœæã§ããããã«ãªããŸãã
expect(a).toEqualMySpecificThing(âŠ)
ããã«ãããããè¡šçŸåè±ããªå€±æã¡ãã»ãŒãžãæžãããšãã§ããã¯ãã§ãã ããã¯Relayã®ãããªãããžã§ã¯ãã§ãã䜿ãããŠããŸãã ãã¹ãŠã®ãããã£ãŒãåç §ããŠãã ããïŒ https ïŒ//github.com/facebook/relay/blob/master/src/tools/__mocks__/RelayTestUtils.js#L281
掻åããªãããééããŸããããè¯ãã¢ã€ãã¢ãããã°åéããŠãã ããã
@ cpojer @ dmitriiabramové 延ã«ã€ããŠãè©«ã³ããŸãã
expect
ãžã®2çªç®ã®åŒæ°ããŸãã¯.because
ã§çç±ãé£éãããã®ã¯çŽ æŽãããããšã§ãã ãããå®çŸããããã«äœãããå¿
èŠããããŸããïŒ
ãšã³ãžãã¢ã¯ãã¹ããæžãã®ã«æéãç¡é§ã«ããããªã
@cpojeråæããŸããïŒ ãã¹ãã®ãããã°ã«æéã浪費ããããªãããšã«å ããŠãããããŸãã«ã倱æã®ã³ã³ããã¹ããå€ããåé·æ§ã®äœãAPIãæãŸãããšç§ãä¿¡ããŠããçç±ã§ãã
ããã€ãã®å ·äœçãªæ°å€ã«ã€ããŠã¯ãäžèšã®ç§ã®ã³ã¡ã³ãã®ç°¡åãªäŸã䜿çšããŠãåçã®ã¢ãµãŒã·ã§ã³ãšããŒãã®ã³ã³ããã¹ããååŸããããã«ãJestã¯ããã°ã©ããŒã«ååŒã®å®åæã®ã»ãŒ2åã®éãæžã蟌ãããã«èŠæ±ããŸãã
ããã¯æ¹åãããå¯èœæ§ããããŸãïŒ
// tape
test('api works', t => {
t.deepEquals(api(), [], 'api without magic provides no items')
t.deepEquals(api(0), [], 'api with zero magic also provides no items')
t.deepEquals(api(true), [1,2,3], 'api with magic enabled provides all items')
t.end()
})
// jest
describe('api works', () => {
test('api without magic provides no items', () => {
expect(api()).toEqual([])
})
test('api with zero magic also provides no items', () => {
expect(api(0)).toEqual([])
})
test('api with magic enabled provides all items', () => {
expect(api(true)).toEqual([1,2,3])
})
})
æŽæ°ïŒç¢å°ã䜿çšããŠ1è¡ã«jestãã¹ããèšè¿°ã§ãããšæããŸãã
// jest
describe('api works', () => {
test('api without magic provides no items', () => expect(api()).toEqual([]))
test('api with zero magic also provides no items', () => expect(api(0)).toEqual([]))
test('api with magic enabled provides all items', () => expect(api(true)).toEqual([1,2,3]))
})
ããã«ãããè¡ãé·ããªããŸããã以åã«æ¯èŒããçµ±èšãå€å°æ¹åãããŸãã
ãã ããè¡ã®å é ã«æ¹è¡ãªãã§ãã¹ãã®èª¬æããããšããã¹ãã®ãèããã€ãŸãå®éã®ã¢ãµãŒã·ã§ã³ãä»»æã®åã®äœçœ®ã«é 眮ããããããããžãã¯ãèŠèŠçã«è§£æããã®ãé£ãããªããšæããŸãã
ã³ãŒãã解æããããšã¯ããã¹ãã®èª¬æãèªãããšãããéèŠã§ãããã¹ãã®èª¬æã¯ãåºæ¬çã«ã¯åãªãæ å ã®ã³ã¡ã³ãã§ãã ããããè¡ã®å é ã«èª°ãã³ã¡ã³ããæžããªãçç±ã§ããããšãã°ãããã¯ãµãããŸããºã ã®çæ°ã«ãªããŸãã
/* api without magic provides no items */ expect(api()).toEqual([])
/* api with zero magic also provides no items */ expect(api(0)).toEqual([])
/* api with magic enabled provides all items */ expect(api(true)).toEqual([1,2,3])
çæ³çã«ã¯ããã¹ãŠã®ã¢ãµãŒã·ã§ã³ã³ãŒããåãåã«ãã¡ããšäžŠãã§ããã®ã§ã人éãç°¡åã«è§£æã§ããŸãã ãã®èãã«åºã¥ããŠã expect
ã®2çªç®ã®åŒæ°ãææ¡ããã®ã§ã¯ãªããæ«å°Ÿã®.because
圢åŒã匷ãéžæããŸãã
äŒè©±ãç¶ããŠãããŠããããšãã ãŸããdescribeãããã¯ãå¿
èŠãªããããããã«å°ãããªããŸãã .because
ã¯æ®å¿µãªããæ©èœããŸãããããã¯ããããã£ãŒãã¹ããŒãããšãã«ïŒ .because
ãåŒã³åºãããåã«çºçããïŒãååãæœåºããæ¹æ³ããªãããã§ãã
次ã«ãåãããã£ãŒé¢æ°ã®æåŸã®åŒæ°ã䜿çšããŸããïŒ
expect
ã®2çªç®ã®åŒæ°ãšããŠè¿œå ããå Žåã«ã®ã¿æ©èœããŸãã
ãããŸããã®ããããã¹ãŠã®ãããã£ãŒé¢æ°ã®æåŸã®åŒæ°ãšããŠè¿œå ããããšã¯ã§ããŸããã
äŸãã°
expect(obj).toHaveProperty('a.b.c', 'is that a reason or a value of the property?');
掻åããªãããééããŸããããè¯ãã¢ã€ãã¢ãããã°åéããŠãã ããã
@cpojer expect(value).toBe(something, 'because message')
ã®ãžã£ã¹ãã³ïŒããã³ãã®ä»ïŒã®æ¹æ³ãé€å€ãããŠãããã©ããã¯äžæã§ããïŒ
1ã€ã®äŸã¯ãã¹ããŒããã·ã³ããã¹ãããŠããredux-saga / redux-observableã®ãã®ããã¹ãããããšã§ãã ã©ã®ç¶æ ã§å€±æãããã«ã€ããŠã®èª¬æçãªã¡ãã»ãŒãžããããšéåžžã«åœ¹ç«ã¡ãŸãã ãã®äŸã¯èæ¡ãããŠããã®ã§ã説æãåæ§ã§ãã
@jayphelpsãã¹ãŠã®ãžã£ã¹ãã³ãããã£ãŒãæžãçŽããã®ã§ããžã£ã¹ãã³ã®æ¹æ³ã䜿çšããªããªããŸãã
@dmitriiabramovç³ãèš³ãããŸããããç§ã®è³ªåã¯æ確ã§ã¯ãããŸããã§ããã ãããè¡ããžã£ã¹ãã³ã®_æ¹æ³_ã¯ãè¿œå ããããšå€æãããŸãããïŒ åœŒããèš±å¯ããã®ãšåãããšãããã
@jayphelpsã¯åã«èšã£ãããã«ããããŸããã®ããã«ãã¹ãŠã®ãããã£ãŒã§æ©èœãããšã¯éããŸããã
expect(obj).toHaveProperty('a.b.c', 'is that a reason or a value of the property?');
æããžã§ã¹ããããã£ãŒã¯ãµãŒãããŒãã£ã®ããã±ãŒãžã§æ¡åŒµã§ããŸãç§ã¯åŒæ°ãªã¹ããå°ç¡ãã«ããã®ã¯è¯ãèãã§ã¯ãªããšæããŸã
æãã¯ãªãŒã³ãªãªãã·ã§ã³ã¯ãããããexpect
ã®2çªç®ã®åŒæ°ãšããŠäœ¿çšããããšã§ããããã¯ãåžžã«1ã€ã®åŒæ°ãåãããã§ãã
expect(123, 'jest because').toEqual(123);
ãã ããAPIããªãŒããŒããŒããããã©ããã¯ããããŸããã Facebookã®ãã¹ãã¹ã€ãŒãã§ã¯ã»ãšãã©äœ¿çšããŠããŸãããç¹å¥ãªå Žåã¯ãæ°ãããã¹ããå®çŸ©ããæ¹ãç°¡åã ãšæããŸãã
beforeEach(someSharedSetup);
test('reason or description', () => expect(1).toBe(1));
ããšæ°è¡ã§ã:)
ãŸãã¯ãå¥ã®describe()
åŒã³åºãã«å
¥ããããšãã§ããŸãã
@dmitriiabramovåä»ãªã±ãŒã¹ã¯ããµã¬ãåäºè©©ãªã©ã®ã¹ããŒããã·ã³ã®ããã«ãç¶æ ãæ§ç¯ããå Žåã§ããåãã¹ãã«ã¯ä»¥åã®ç¶æ ã®å€æŽãå¿ èŠã§ãããããããåé¢ããã«ã¯ãAFAIKãååŸããã«å€§éã®è€è£œãå¿ èŠã§ãã
it('stuff', () => {
const generator = incrementAsync();
expect(generator.next().value).toBe(
call(delay, 1000)
);
expect(generator.next().value).toBe(
put({ type: 'INCREMENT' })
);
expect(generator.next()).toBe(
{ done: true, value: undefined }
);
});
ãŸãã¯ãå¥ã®describeïŒïŒåŒã³åºãã«å ¥ããããšãã§ããŸãã
ããã詳ãã説æããŠããã ããŸããïŒ ãã¹ãèšè¿°åŒã³åºãAFAIKã¯ã»ã¯ã·ã§ã³ã¿ã€ãã«ãåå²ããããã ãã®ãã®ã§ãããããã¹ãã¯åŒãç¶ãåæã«å®è¡ãããŸããïŒ
ãã¹ãã¹ã€ãŒãïŒãã¡ã€ã«ïŒã¯åæã«å®è¡ãããŸããã test()
åŒã³åºãã¯å®è¡ãããŸããã
ç§ã¯ãã®ãããªãã®ãèãå§ããŠããŸã
test('111' () => {
jest.debug('write something only if it fails');
expect(1).toBe(2);
});
ç©ã«ãªãããšãã§ããŸã
ãã®è°è«ãšãã®ãªããžããªãããç§ã¯çŽ æŽããããŠæå³ã®ãããã®ã¯æ¬¡ã®ããã«ãªããšæããŸãïŒ
it('has all the methods', () => {
since('cookie is a method').expect(reply.cookie).toBeDefined();
since('download is a method').expect(reply.download).toBeDefined();
since('end is a method').expect(reply.end).toBeDefined();
// ...
});
䜿çšæ³ã¯because
ã®ãã®ãšäŒŒãŠããŸãããæå³çã«æå³ããããŸãã
ãããæ°ã«å
¥ã£ããã since
æ©èœãè¿œå ããŠPRãè¡ãããšãã§ãããããããŸããã
ãããè¡ãç°¡åãªæ¹æ³ãå®è£ ããŠãã ããã ç§ã¯ããŸãé »ç¹ã«äœ¿çšããŸããããç¹ã«ããè€éãªãã¹ãã®å Žåã¯ãæãäžããã«äœã倱æããŠããããæ£ç¢ºã«ç¥ãããšã圹ç«ã¡ãŸãã
ããã¹ãã¹ã€ãŒããããåçŽã«ãªãããã«æžãçŽããŠãã ããããšã¯èšããªãã§ãã ããã ãšã³ãžãã¢ã_writing_ãã¹ãã¹ã€ãŒã以äžã«å«ãã®ã¯_rewriting_ãã¹ãã¹ã€ãŒãã ãã§ãã
ç§ãã©ããã§èŠãå¥ã®ææ¡ã¯ããããããŸããããªãçç±ã®èª¬æãšãšãã«ããããšãŸã£ããåãåé¡ã®ã©ãã«ãã£ãããå¿ããŠããŸãã ç§ã¯ããããå°ãç ãå¿
èŠããããŸã:)
ããã€ãã®ç°¡åãªããããã¿ã€ãããã¢ãæ©èœããããã«ãªããŸãããä»ããååž°ãå®è£ ããå¿ èŠããããŸãã ããã¯ãã°ããŒãã«å€æ°ã®åšãã«ãããã·ã䜿çšãã次ã«åã¡ãœããã«äœ¿çšããèãã©ãããŒã§ãã ãã ãããããã·ã¯å€ããã©ãŠã¶ã§ã¯ãµããŒããããŠããããããªãã£ã«ã§ããªããããJestã§ã¯åãå ¥ããããªãå¯èœæ§ããããŸãã ããã¯ãã©ãããŒã®äžè¬çãªæ§é ã§ãã
const since = (text) => {
return new Proxy(global, {
get: (orig, key) => {
return (...args) => {
try {
const stack = orig[key](...args);
return new Proxy(stack, {
get: (orig, key) => {
return (...args) => {
try {
const ret = orig[key](...args);
// ... implement recursion here
} catch (err) {
console.log('2', key, text, err);
throw err;
}
}
}
});
} catch (err) {
console.log('1', key, text, err);
throw err;
}
};
}
});
};
3ã€ã®çŸå®çãªãªãã·ã§ã³ããããŸãã
ç·šéïŒå®éã®åäœã確èªããŠãã ããïŒ
describe('Test', () => {
it('works', () => {
since('It fails!').expect('a').toEqual('b');
});
});
èªæã§ãªããã¹ããããå Žåã«ãã¹ãçµæãæ£æ°ã«ããããã«ã¯ãæåŸ ã³ã³ããã¹ããå¿ èŠã§ãã å®éã®ãã¹ãã¯å¿ ãããããã»ã©åçŽã§ã¯ãããŸããã
ã«ã¹ã¿ã ãããã£ãŒãèŠããŠãããŠãã ãã-ãããã¯ããã·ã³ã°ã®è€éããé ããŸãã ãããããã¹ãã倱æããå Žåã倱æã«é¢ããæ倧ã®æ å ±ãå¿ èŠãªããããã®è€éããé ãããšã¯ããªããæãããšã§ã¯ãããŸããã æåŸ ã³ã³ããã¹ãã«ããããã®ã³ã³ããã¹ããæåã§æäŸã§ããŸãã çæ³çã§ã¯ãªããšæããŸãããããçš®ã®èªåã³ã³ããã¹ãã®æ¹ãè¯ãã§ããããããããç§ãä»ãŸã§èŠãå¯äžã®æ¹æ³ã§ãã
äœããå£ããŠå€±æããå ŽåãJestã䜿çšããŠæåã§ãããã°ãããããã°ãªã©ã®_å€æŽãè¿œå ããå¿
èŠããããŸããããã¯ããã¹ãã®å®è¡çµæã確èªãããããã¯ããã«äŸ¿å©ã§ã¯ãããŸããã
ããšãã°ããžã£ã¹ãã³ã§ã¯ã倱æã«ã€ããŠããç解ã§ããããã«ã³ã³ããã¹ããå°å·ããããšãã§ããŸãã
Javaã§æã人æ°ã®ãããã¹ããã¬ãŒã ã¯ãŒã¯JUnitã«ãããŸã£ããåãæ©èœããããŸãã
ééããå Žåã¯ç³ãèš³ãããŸãããããã®æ©èœã«å¯Ÿãã_æè¡çãª_åè«ã¯ããã«ã¯ãããŸããã ãããŠããèŠæ ããæªãã®ã§ããããè¿œå ãã¹ãã§ã¯ãªãããªã©ã®ããšã¯ã°ãããŠããŸãã
åéã§ããŸããïŒ äžèšã®@aaronabramovã«ãã£ãŠææ¡ãããjest.debug()
ã§ããç§ã«åœ¹ç«ã¡ãŸãã
This:
it('has all the methods', () => {
since('cookie is a method', () => expect(reply.cookie).toBeDefined());
});
can be supported by adding this:
// setupTestFrameworkScriptFile.js
// http://facebook.github.io/jest/docs/configuration.html#setuptestframeworkscriptfile-string
global.since = (explanation, fn) => {
try {
fn();
} catch(e) {
e.message = explanation + '\n' + e.message;
throw e;
}
};
ãŸãã jasmine-custom-messageã¯ãèŠæ±ããããã®ãšäŒŒãŠããŸãã
describe('test', function() {
it('should be ok', function() {
since(function() {
return {'tiger': 'kitty'};
}).
expect(3).toEqual(4); // => '{"tiger":"kitty"}'
});
});
ãããåéããäºå®ã¯ãããŸããïŒ æè¿ããã®åé¡ã®éè€ããã£ãããã§ãã ãŸãããã¹ãã倱æãããšãã«ã«ã¹ã¿ã ã¡ãã»ãŒãžã衚瀺ããããšæã£ãŠããŸãã
ããŒã..ããããŠã£ãã·ã¥ãªã¹ãã«èŒã£ãŠãããã®ã§ãã ãã®ã¹ã¬ãããèªãã åŸãFacebookã§ã®Jestã®äœ¿çšã«é¢ããå¿çãç解ã§ããèªåã®ã¯ãŒã¯ãããŒã«åœ±é¿ãäžããããªãã®ã§ãããæ¢åã®ãã¹ãã«å¹²æžãããä»ã®ããã€ãã®äººãæãã§ããæ©èœãè¿œå ããææ¡ãããã€ããããŸããæã£ãŠããïŒç§èªèº«ãå«ãïŒã
2çªç®ã®åŒæ°ãexpectïŒïŒãŸãã¯sinceïŒïŒåœ¢åŒã®ãããããPRãšããŠåãå ¥ããããã«ã¯ãäœãå¿ èŠã§ããïŒ ç§ã¯ãããå©ããããã«å°ãæéãå¯ä»ããããšæã£ãŠããŸãã
ç§ã¯ã¹ã¬ãããèªãã ã°ããã§ãäž¡åŽã«è¯ãè°è«ããããŸãã @timoxleyãæåã«æçš¿ããã®ãšåãçç±ã§ãã«ã¹ã¿ã ãšã©ãŒã¡ãã»ãŒãžãæäŸããã¡ã«ããºã ã絶察ã«å¿ èŠã§ãã ä»ãç§ã¯ãã®ãããªããšãããŠããŸãïŒ
import assert from 'assert'
import chalk from 'chalk'
test('api works', () => {
assert.deepEqual(
api(),
[],
chalk.red('api without magic provides no items')
)
assert.deepEqual(
api(0),
[],
chalk.red('api with zero magic also provides no items')
)
assert.deepEqual(
api(true),
[1, 2, 3],
chalk.red('api with magic enabled provides all items')
)
})
ããã¯å®éã«ã¯éåžžã«ããŸãæ©èœããŸãããèµ€ãè²ãååŸããããã«ãã§ãŒã¯ã䜿çšããå¿
èŠã¯ãããŸããïŒãã以å€ã®å Žåã¯è²ãªãã§å°å·ããŸãïŒããããexpect
ã§ãµããŒãããããšããå§ãããŸãã
ç§ã¯ãããã©ã®ããã«æ£çŽã«å®è£
ãããŠãããã¯æ¬åœã«æ°ã«ããŸããã ããããä»ã®äººãããã奜ãå Žåã«åããŠãäœãä»ã®ãã®ãããã«æãåºãããã ãã«ã since
ã«ä»£ãããã®ããããŸãïŒ
const expectWithMessage = expect.withMessage(
'api with magic enabled provides all items'
)
expectWithMessage(api(true)).toEqual([1, 2, 3])
// could be rewritten like
expect
.withMessage('api with magic enabled provides all items')(api(true))
.toEqual([1, 2, 3])
since
ããè¯ããã®ã奜ããã©ããã¯ããããŸããã ç§ã¯äœã§ãäžæã§ããç§ã¯æ¬åœã«ããã欲ããã§ã:)
ããããããŠã³ã¡ã³ãã«å¯ŸåŠããããã«ïŒ
ãããããŸã圹ã«ç«ããªããšæãçç±ã¯ããšã³ãžãã¢ããã¹ããæžãã®ã«æéãç¡é§ã«ããããªãããã§ãã 圌ãã«ãšã£ãŠãããé£ãââãããããã«ç§ãã¡ãããããšã¯ããã ããæªããã¹ãã«ã€ãªããã§ãããã
ãã¹ãã®äœæãé£ããããããªãããšã«åæããŸãã ãã®ãããããã¯è¿œå ã®å€æŽã«ãªããŸãã ãããã£ãŠããã¹ãã®ãããã°ã容æã«ããããã«ãæéãç¡é§ã«ãããããšãæãŸãªã人ã¯ã圹ç«ã€ã¡ãã»ãŒãžãã¹ãããã§ããŸããããã®ãããªåœ¹ç«ã€ã¡ãã»ãŒãžãå«ãã³ãŒãããŒã¹ã«ã¢ã¯ã»ã¹ããŠãæè¬ããŸããã¢ãµãŒã·ã§ã³ãå°ã説æããã®ã«æéãããããšã³ãžãã¢ïŒwinkïŒ
ããã«ã¡ã¯@cpojerããã«é¢ããæŽæ°ã¯ãããŸããïŒ
Jestã¯ããã®åé¡ãé€ããŠãç§ã«ãšã£ãŠããŸãæ©èœããŠããŸã...çŸæç¹ã§ã¯ã次ã®ãããªforã«ãŒãå
ã§å€±æããã¢ãµãŒã·ã§ã³ãä¿®æ£ããã®ã«èŠåŽããŠããŸãã
expectationsArray.forEach(expectation => expect(...))
ã«ã¹ã¿ã ãšã©ãŒã¡ãã»ãŒãžãªãã§ã©ã®æåŸ ã倱æããããæ£ç¢ºã«ææ¡ããããšã¯å°é£ã§ãïŒç§ãééã£ãŠããå Žåãé€ããŸã..ïŒïŒ
ããããšã
@ mj-airwallexããšãã°ãforã«ãŒãã§æåŸ
å€ãtest
ã§ã©ããããã®ã¯è¯ãããšã§ãã
const expectationsArray = [[0, 'a'], [1, 'b']];
expectationsArray.forEach(([expectation, desc]) => {
test(`test ${desc}`, () => {
expect(expectation).toBeGreaterThanOrEqual(2);
});
});
æåŸ
ã®éã«ã«ã¹ã¿ã ã¡ãã»ãŒãžãæäŸããå¿
èŠããããããjestã«ãåé¡ããããŸãã test
ã§æåŸ
å€ãã©ããããããšã¯ãéåæåŒã³åºãã®å¿
èŠããªãå Žåã«æ©èœããããã§ãã ãã ããJestã¯describe
ïŒïŒ2235ïŒãpromiseãè¿ãããšãåŠçã§ããªããããéåæåŒã³åºãã䜿çšããŠãã¹ããäœæãããã test
ã§ã©ãããããããããšã¯ã§ããŸããã ãŸããè€æ°ã®test
ãã¹ãããããšã¯ã§ããŸããã
åé¡ã説æããäŸã次ã«ç€ºããŸãã
async function getArray() {
return [0,0,0,0,0,0]
}
describe('Custom messages with async', async () => {
const array = await getArray();
array.forEach((item) => {
test(`test${item}`, () => {
expect(item).toBe(0)
});
});
})
ãããåŠçããæ¹æ³ã¯ãããŸããïŒ
OPã®åé¡ïŒãã©ã®æåŸ ã倱æããããããã«æããã«ããã人éãèªãã圢åŒã®ã³ã³ããã¹ããããã°ããã®ã«ãïŒãèŠããšãããã§è§£æ±ºãããšæããŸãã Jest 22ã®æç¹ã§ã倱æããã¢ãµãŒã·ã§ã³ã®ã³ã³ããã¹ããåºåããŸãã è¿œå ã®ã¡ãã»ãŒãžã¯ãŸã å¿ èŠã§ããïŒ _is_ã®å Žåãã¢ãµãŒã·ã§ã³ã®äžãŸãã¯æšªã«ããã³ãŒãã³ã¡ã³ãã§ããå¯èœæ§ããããŸã
éåæèšè¿°ã¯å¥ã®åé¡ã§ãïŒè¿œå ãããã³ãŒããã¬ãŒã ã§ã¯è§£æ±ºãããŸããïŒ
ç§ã¯éåæèšè¿°ã䜿çšããã代ããã«beforeEach
ãŸãã¯beforeAll
ã䜿çšãããšæããŸã
@kentcdoddsã¯ã beforeEach
ãŸãã¯beforeAll
ã§ãããåŠçããæ¹æ³ã®äŸãæäŸã§ããŸããïŒ å¿
èŠãªãã¹ãŠã®éåæåŒã³åºãã®çµæãbeforeEach
ãšbeforeAll
ã§äœæããããšãããšãæçµçã«ã¯ãèš±å¯ãããŠããªããã¹ããããtest
ãäœæããå¿
èŠããããŸãã
ãããç§ã¯ããªãããã®éåæåŒã³åºãã§äœãããŠããããéããŸããã ç³ãèš³ãããŸãããð
ããã beforeEach
ãŸãã¯beforeAll
ãå®è¡ããããšã¯ã§ããŸããã§ããã
@SimenB ãã³ã³ããã¹ããå°å·ãããšããã§ã«å€ãã®ããšã圹ç«ã¡ãã«ã¹ã¿ã ã¡ãã»ãŒãžã®åé¡ã®ã»ãšãã©ã解決ãããŸãã ãããããããšãïŒ ãã ããã«ãŒãå ã§expectsã䜿çšããå Žåãªã©ã®ç¶æ³ã§åœ¹ç«ã€ãããã«ã¹ã¿ã ã¡ãã»ãŒãžãåŒæ°ãšããŠæ瀺çã«æå®ã§ãããšäŸ¿å©ã§ãã
@tojuhakaãããè©ŠããŠãã ããïŒ https ïŒ//github.com/negativetwelve/jest-plugins/tree/master/packages/jest-plugin-context
OPã®åé¡ïŒãã©ã®æåŸ ã倱æããããããã«æããã«ããã人éãèªãã圢åŒã®ã³ã³ããã¹ããããã°ããã®ã«ãïŒãèŠããšãããã§è§£æ±ºãããšæããŸãã
ã¯ããããã¯å ã®åé¡ã解決ããŸãããã ããã»ãšãã©ã®JestãŠãŒã¶ãŒãæã£ãŠãããå€æåã®å ã®ãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããå Žåã«éããŸãã IMOã¯ããŠãŒã¶ãŒã倱æãããŠãŒã¶ãŒæäŸã®ã¡ãã»ãŒãžãå°å·ã§ããããã«ããã®ã«æ¯ã¹ãŠå°ãæéãããããŸãããååã ãšæããŸãã
Jestã䜿ãå§ããã°ããã§ããããã®ãããªæ©èœããããŸããã ç§ã®ãŠãŒã¹ã±ãŒã¹ïŒ
ãªããžã§ã¯ãã®ããããã£ãçå®ã§ãããšäž»åŒµãããã¹ãã¯å€±æããŠããŸãã ã¢ãµãŒã·ã§ã³ã倱æããå Žåã«ãªããžã§ã¯ãããã°ã«èšé²ã§ããã°ã倱æãããæ©ãç解ããã®ã«åœ¹ç«ã¡ãŸãã
ãã®ããã«toHaveProperty
ã䜿çšã§ããŸãã
test('property', () => {
expect({foo: 'bar'}).toHaveProperty('baz', 'foobar');
});
ããã«ããããšã確èªãããã ãã®å Žåã¯ã2çªç®ã®åŒæ°ãåé€ããŠãã ããã _some_å€ãããããšãè¡šæãããã ãã®å Žåã¯ã expect.anything()
ã䜿çšã§ããŸãã
toMatchObject
ã¯å¥ã®éžæè¢ã§ãã
å¿
èŠã«å¿ããŠã assert
ã䜿çšããããšãã§ããŸãã
test('property', () => {
const obj = {foo: 'bar'};
assert.equal(obj.baz, 'foobar', JSON.stringify(obj));
});
å
端ãããããšãã assert.equal(obj.baz, 'foobar', JSON.stringify(obj));
ã¯ãç§ã®ç¹å®ã®ã±ãŒã¹ã§ãã®ä»äºãããŸãã
@SimenB @mpseidelã¢ãµãŒããšã¯äœã§ããïŒ ãµãŒãããŒãã£ã®ã©ã€ãã©ãªã§ããïŒ jestããã¥ã¡ã³ãã«äœãèŠã€ãããŸããã
@sharikovvladislav assert
ã¯ããŒãã³ã¢ã¢ãžã¥ãŒã«ã§ãhttps://nodejs.org/api/assert.html
@mpseidelãã£ãšïŒ ç¥ããŸããã§ããã ããããšãã ã§ããŸãã
次ã®ã³ãŒããã©ã°ã¡ã³ãã䜿çšããŠããã¬ãŒã ã¯ãŒã¯ã®ãã®å¶éãããã¯ããŠããŸãïŒTypeScriptã§ã¯ãJSã®å泚éãåé€ããã ãã§ãïŒ
export const explain = (expectation: () => void, explanation: string) => {
try {
expectation();
} catch(e) {
console.log(explanation)
throw e;
}
}
ããã«ã¡ã¯ã
ãŸã 誰ãã«ãŒãã«ã€ããŠèšåããŠããªãããšã«é©ããŠããŸãã ã¡ãã»ãŒãžã¯åãªãæååã§ã¯ãªããã«ãŒãã®å埩ã«å¿ããåçãªæååã«ãªããŸãã
jest-plugin-context
ã¯çŽ æŽãããã§ããããã¯ããŸããããŸããããå°ãéããæåã®åé¡ã¯ãŸã é¢é£æ§ã®ããimoã§ãã
ãã®ãã¹ããèŠãŠãã ãã
describe('MyStuff', () => {
it('should render and contain relevant inputs', () => {
const wrapper = shallowWrapped(<MyStuff />);
const expectedKeys = ['love','jest','but','need','details','for','expect'];
expectedKeys.forEach((key) => {
expect(wrapper.find({ id: key }).length).toEqual(1);
});
});
});
ããªãã®ç¯äººãèŠã€ããŠé 匵ã£ãŠãã ããã ä»ã®ãšããã {len:.., key:..}
ã®ããã«è¡ãè¿œå ãããããªããžã§ã¯ãããã¹ãããå¿
èŠããããŸããããã¯ã¯ãªãŒã³ã§ã¯ãªãããŠãŒã¶ãŒãã¬ã³ããªãŒã§ããããŸããã
ãã®ãŠãŒã¹ã±ãŒã¹ã¯ãããšãã°ãã©ãŒã ãã¢ã€ãã ã®ã¬ã³ããªã³ã°ãã§ãã¯ã«é¢é£ããŠãããšæããŸãã
æ§æã¯toEqual(1).context("my message")
ãŸãã¯toEqual(1, "my message")
ã®ããã«åçŽã«ããããšãã§ããŸãïŒãã¡ãããå®è£
ã¯åžžã«é£ããããšãç¥ã£ãŠããŸããJestã§è¡ã£ãçŽ æŽãããä»äºãå°éããŸãïŒã
ãã¶ãchai
ãšåã圢åŒã䜿çšããŸã-ã€ãŸããexpectåŒã³åºãã®2çªç®ã®åŒæ°ãšããŠã¡ãã»ãŒãžãè¿œå ããŸãã
expect(foo, 'this detail').toEqual(2)
T
以åã¯ãžã£ã¹ãã³ã䜿çšããŠããã®ã§ããµããŒããããŠããªãããšã確èªããããã«ããã«æ¥ãŸããã
ãã ãããããã¯ãã¹ãŠæ©èœã§ãã 次ã®ãããªããšã ããè¡ãããšã¯ã§ããŸãããïŒ
describe('MyStuff', () => {
describe('should render and contain relevant inputs', () => {
const wrapper = shallowWrapped(<MyStuff />);
const expectedKeys = ['love','jest','but','need','details','for','expect'];
expectedKeys.forEach((key) => {
it(`contains key "${key}"`, () =>
expect(wrapper.find({ id: key }).length).toEqual(1)
)
})
});
});
@akkermançŽ æŽããã解決çã èšè¿°ããããã¯åè«ã«ãã£ãŠæäŸãããéæ³ã®ã°ããŒãã«ã§ããããããããããããŸãã«æããå¯èœæ§ãããããšãèªããªããã°ãªããŸãããã«ãŒãã§ãtããæžãããšãããŸããããã©ããã¯ããããŸããã§ããã
å¥ã®ä¿®é£Ÿåãé£éãããã®ã¯ã©ãã§ããïŒ
expect(foo).toEqual(bar).because('reason with %s placeholders')
ãŸãã¯å€åé¢æ°
expect(foo).toEqual(bar).explainedBy((result) => `Lorem ipsum ${result}`)
å¥ã®ä¿®é£Ÿåã¯ããã«èªããªããªããšæããŸãã
T
2018-04-19 13:47 GMT + 02ïŒ00λâ¢Geovani de [email protected] ïŒ
å¥ã®ä¿®é£Ÿåãé£éãããã®ã¯ã©ãã§ããïŒ
expectïŒfooïŒ.toEqualïŒbarïŒ.becauseïŒ 'ïŒ sãã¬ãŒã¹ãã«ããŒã®ããçç±'ïŒ
ãŸãã¯å€åé¢æ°
expectïŒfooïŒ.toEqualïŒbarïŒ.explainedByïŒïŒresultïŒ=>
Lorem ipsum ${result}
ïŒâ
ã³ã¡ã³ãããã®ã§ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/facebook/jest/issues/1965#issuecomment-382705387 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AAM5PwBCvET1KdEDeDEF7gGo708Naj8oks5tqHlSgaJpZM4Kc6Uu
ã
-
Tarjei Huse
ã¢ãŒãã«ïŒ920 63 413
expect
ãæ©èœããæ¹æ³ã¯ã¹ããŒããããšã§ããããããšã«ããæ©èœããŸããã
expect(something, 'some helpful text on failure').toEqual(somethingElse)
ãŸãã¯expect.context(something, 'some helpful text on).toEqual(somethingElse)
ã®ã©ã¡ãããæè¯ã®éžæè¢ã ãšæããŸãããã©ã¡ããããŸã奜ãã§ã¯ãããŸãã
ãããåéã§ããŸããïŒ Jestã«ã¯ãè€æ°ã®çžäºäœçšã§ç¶æ ãã©ã®ããã«å€åãããããã¹ãããããã®é©åãªãœãªã¥ãŒã·ã§ã³ããŸã ãªãããã§ããããšãã°ã次ã®ããã«ãªããŸãã
ãããã®ã±ãŒã¹ã¯ã©ã¡ãããäžé£ã®ã¢ã¯ã·ã§ã³ãå®è¡ããåã¢ã¯ã·ã§ã³ã®åŸã«ç¶æ
ãã©ã®ããã«å€åãããïŒãŸãã¯å€åããªãã£ããïŒãã¢ãµãŒãããå¿
èŠãããããããã«ãã¢ãµãŒã·ã§ã³ãã¹ããå¿
èŠã«ãªãå ŽåããããŸãã ãã®çš®ã®åé¡ãbeforeEach
ã§è§£æ±ºã§ãããšã¯éããŸããã
ç§ã¯ãããæ¬åœã«åœ¹ç«ã€ç¶æ³ãèŠã€ãç¶ããŠããŸãã ç¹ã«ã @ callumlockeã説æããããã«ãè€æ°ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãšã¢ãµãŒã·ã§ã³ãå®è¡ããŠããå Žåã
人ã ãå«ãã§ã¯ãªãAPIãæãã€ããå Žåãããã¯ããªããé²ãã§è¿œæ±ããããã®ã§ããïŒ ããã¯äŸ¡å€ãããããã䜿ãããæ©èœã ãšæããŸãã
ææ¡ããããœãªã¥ãŒã·ã§ã³ã®æŠèŠã¯æ¬¡ã®ãšããã§ãã
expect(api()).toEqual([]) // api without magic provides no items
it('api without magic provides no items', () => expect(api()).toEqual([]))
test('api without magic provides no items', () => expect(api()).toEqual([]))
expect(api()).toHaveNoItems()
expect(api(), 'api without magic provides no items').toEqual([])
expect(api()).because('api without magic provides no items').toEqual([])
since('api without magic provides no items').expect(api()).toEqual([]))
because('api without magic provides no items').expect(api()).toEqual([]))
jest.debug('api without magic provides no items'); expect(api()).toEqual([]))
æ«å°Ÿã®.because()
ã¯äœ¿çšã§ããªãããããªãã·ã§ã³ãšããŠå«ãŸããŠããªãããšã«æ³šæããŠãã ããã
çŸåšãæåã®ã°ã«ãŒãã®4ã€ã®ãªãã·ã§ã³ãã¹ãŠããµããŒããããŠããŸãã å人çã«ã¯ãæåã®ãªãã·ã§ã³ïŒã³ã¡ã³ãä»ãã®ã³ãŒããã¬ãŒã ïŒãããŸãæ©èœããããšãããããŸããã ãããŠããããããããã«åªããŠããã®ã¯ãã«ã¹ã¿ã ãããã£ãŒïŒãªãã·ã§ã³4ïŒã䜿çšããããšã§ãã
ãããåããããã«ç解ããå¿ èŠãããã®ã¯ãæåã®ã°ã«ãŒãã®ãªãã·ã§ã³ããã2çªç®ã®ã°ã«ãŒãã®ãªãã·ã§ã³ã®æ¹ãé åçã ãšæããŸãã 2çªç®ã®ã°ã«ãŒãã¯ãæäŸãããã¹ãŠã®ãããã£ãŒïŒéåæãããã£ãŒãé察称ãããã£ãŒãã¹ãã€ãããã£ãŒãã¹ããŒãããã£ãŒããããã¹ãããã£ãŒãã«ã¹ã¿ã ãããã£ãŒå šäœïŒã®ã³ã¢ã¡ã³ããã³ã¹ãæ£åœåã§ãããã®ãè¿œå ããŸããïŒ
ããã«ã¡ã¯ã
åºæ¬çã«ãããã€ãã®ãŠãŒã¹ã±ãŒã¹ããããŸãã
æåã®ã°ã«ãŒããªãã·ã§ã³ã¯ãäž»ã«æåã®ãŠãŒã¹ã±ãŒã¹ã察象ãšããŠããŸãã ææ¡ãããŠããããã«ãåçã«çæãããã¢ãµãŒã·ã§ã³ãå¿
èŠãªå Žåã¯ã it
ãštest
ãžã®åŒã³åºãããã¹ãããŠããã¹ããã«ãŒãå
ã§æ°ãããã¹ããçæã§ããããã«ããããšãã§ããŸãã åé¡ã¯ãã¢ãµãŒã·ã§ã³ã§ã¯ãªããã¹ããçæããããšã§ãã 1000èŠçŽ é
åã®åèŠçŽ ã«äœããã¢ãµãŒãããããšæ³åããŠãã ãããããã¯ãã¹ãã®èŠçŽãè¥å€§åãããŸãã
ãã ãããããã®åçãªãŠãŒã¹ã±ãŒã¹ã¯ãŸã ãŸãã§ãããããã¡ã³ããã®äœæ¥ãæå°éã«æãããœãªã¥ãŒã·ã§ã³ã«åºå·ããå¿
èŠããããŸãã ç§ã¯å人çã«because/since
ãœãªã¥ãŒã·ã§ã³ã奜ãã§ãããªããªããããã¯éåžžã«åçŽã«èãããããã§ãã å®è£
ã¯ãã»ãšãã©ã®å Žåãã¡ãã»ãŒãžãåºåããŠè¿ãtry/catch
ã§expect
ãã©ããããããšã«ãªããšæããŸããïŒ
jest.debug
ã¯å¥åŠã«èãããŸããããã¹ããå®éã«åæ Œããå Žåã§ãããããã°ã¯ã¡ãã»ãŒãžãåºåããŸãã
ãæåŸã®åŒæ°ããªãã·ã§ã³ãè¯ãã§ããã expect
ã¯å¯å€æ°ã®åŒæ°ãåãå
¥ããããšãã§ããã®ã§ããããå®è¡å¯èœãã©ããã¯ããããŸããã
ç§ã¯ã©ããªãªãã·ã§ã³ã§ã倧äžå€«ã§ãã æ©èœã欲ããã ãã§ãã ç§ã¯jest.debug
APIã«ã€ããŠã倧ããããšã¯ãããŸãããããããçã«ããªã£ãŠããå¯äžã®APIã§ããå Žåã¯ããã®æ©èœãå¿
èŠãªã ããªã®ã§åé¡ãããŸããã
@kentcdoddsæ¢åã®4ã€ã®ãªãã·ã§ã³ã¯ã©ãã§ããïŒ
@ eric-burelã¯ãJest 23ïŒJest <23ã®ã¹ã¿ã³ãã¢ãã³ãšããŠå©çšå¯èœïŒã«test.each
ãšdescribe.each
ãè¿œå ãããŠããã®ãèŠãããšããããŸããïŒ
ç§ãèšã£ãããã«ãç§ã¯ç§ãã¡ãã©ã®ãªãã·ã§ã³ã䜿ããã¯æ¬åœã«æ°ã«ããŸããã æ©èœãååšãããã ãã§ãã åªå é ã«äžŠã¹æ¿ãããšã次ã®ããã«ãªããŸãã
expect(api(), 'api without magic provides no items').toEqual([])
because('api without magic provides no items').expect(api()).toEqual([]))
since('api without magic provides no items').expect(api()).toEqual([]))
expect(api()).because('api without magic provides no items').toEqual([])
jest.debug('api without magic provides no items'); expect(api()).toEqual([]))
(test|describe).each
ã¯çŽ æŽãããã§ããã1åã®ãã¹ãã§è€æ°ã®ã¢ã¯ã·ã§ã³/ã¢ãµãŒã·ã§ã³ãå¿
èŠãªåé¡ã¯è§£æ±ºããŸããã
ãã®æ©èœã¯çŸåšã次ã®4ã€ã®ãªãã·ã§ã³ã§ååšããŸãã
expect(api()).toEqual([]) // api without magic provides no items
it('api without magic provides no items', () => expect(api()).toEqual([]))
test('api without magic provides no items', () => expect(api()).toEqual([]))
expect(api()).toHaveNoItems()
ãããã®äœãåé¡ã«ãªã£ãŠããŸããïŒ ææ¡ããã_æ°ãã_ãœãªã¥ãŒã·ã§ã³ã¯ããããã®æ¢åã®ãœãªã¥ãŒã·ã§ã³ããããããã«åªããŠããããã«èŠããŸãã ã¡ã³ããã³ã¹ã³ã¹ããæ£åœåããããã«ãç§ãã¡ãæã£ãŠãããã®ã«ã©ã®ãããªã¡ãªããããããŸããïŒ
@rickhanloniiããŒã¹ç§ã¯test.each
ã«ã€ããŠç¥ããŸããã§ãããããã¯æ¬åœã«çŽ æŽãããæ©èœã§ãããããææããŠãããŠããããšãã é
åããåçã«çæããããã¹ãã§ããç§ã®3çªç®ã®ãŠãŒã¹ã±ãŒã¹ã®åé¡ã¯è§£æ±ºãããšæããŸãã
ãã®ãããç§ããªã¹ããã2çªç®ã®ã¡ãã»ãŒãžãæ®ããŸãããåçã«å€±æã¡ãã»ãŒãžãçæããããšã§ããããã°ãé«éåãããŸãã çŸåšããŠãŒã¹ã±ãŒã¹ã¯ããŸããããŸããããªããžã§ã¯ããã£ãŒã«ãã®å€ããã¹ããããšãã«ã倱æãããšãã«ãªããžã§ã¯ãå
šäœãå°å·ãããå ŽåããããŸãã ããã¯æ£åœãªimoã§ãããããããªãã®ãå°ãåé·ãªãã®ã§ãã£ãŠãããã¹ãã®äœæã容æã«ãããã®ã§ãã çµå±ã®ãšããã it
ãštest
ã®äž¡æ¹ãæžãããšãã§ããŸãããéãããªãéããããã¯äž»ã«å¿«é©ãã®ããã§ãã
ãã®ã¹ã¬ããã瀺ãããã«ãããã¯éçã§ãããå®éã«ã¯ãŠãŒã¶ãŒãæåŸ
ãããã®ïŒããããªãïŒã§ãã
ç·šéïŒ it
ãŸãã¯test
ã䜿çšããŠå¥ã®ãã¹ãã§ãã¹ããäœæããåçã«çæããããã¹ãã®ååã¯æå¹ãªãœãªã¥ãŒã·ã§ã³ã§ãããã¢ãµãŒã·ã§ã³ãäœæããããšãæå³ããå Žåããã¹ããäœæããã®ã¯æ¬åœã«å¥œãã§ã¯ãããŸããã ãã®ã¹ã¬ããã§è§£æ±ºçãæäŸãããŠããªããã°ããããå¯èœã ãšã¯æããããŸããã§ããã
çã£ãŠãã 2çªç®ã®ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒãexpectïŒïŒã«è¿œå ããã ãã§ãã ããã䜿ããã人ã¯ïŒéžæçã«ïŒäœ¿ãã䜿ããªã人ã¯äœ¿ããŸããã
ã¢ã«ã¯ãããæ°žé ã«ç¶ããŠããŸãã...ããã¯ç§ãäœå¹Žãåã«ãžã£ã¹ãã³ãæŸæ£ããçç±ã®1ã€ã§ãïŒãã1ã€ã¯ã¿ã€ããŒã®ã¢ãã¯ãã¯ããã«åªããŠããŸãïŒãä»ã®ãžã£ã¹ãã³èªå°äœã
ãšã©ãŒæã«ã¡ãã»ãŒãžãåºåããããšã¯ãä»ã®å€ãã®ãã¹ããã¬ãŒã ã¯ãŒã¯ã§ã¯æ £äŸã§ãããJestã«è¡šç€ºãããªãããšã«é©ããŸããã ãã®ã¹ã¬ããã§åœ¹ç«ã€äŸãããããèŠã€ããŸãããïŒãããã«æè¬ããŸãïŒããã¹ãã®å€±ææã«ã«ã¹ã¿ã ãšã©ãŒãåºåããæ瀺çãªæ¹æ³ãè¿œå ãããšãJestã®äœ¿ãããããåäžããŸãã ããã«ãããä»ã®ãã¹ããã¬ãŒã ã¯ãŒã¯ïŒJS以å€ã®ãã¬ãŒã ã¯ãŒã¯ãå«ãïŒã«æ £ããŠããéçºè ãJestãç°¡åã«å©çšã§ããããã«ãªããŸãã
@mattphillipsããã§jest-chainã«äŒŒãäœããããŠããŠãŒã¶ãŒã©ã³ãã«ãœãªã¥ãŒã·ã§ã³ãååšãããããšã¯å¯èœã ãšæããŸããïŒ ããšãã°ã expect
ã®2çªç®ã®åŒæ°
æ£çŽãªãšãããããã¯ã»ãšãã©ã®JSãã¹ããã¬ãŒã ã¯ãŒã¯ã§éåžžã«æšæºçãªãã®ã§ãã ãã¹ãŠã®ãã¹ããã«ã¹ã¿ã ãšã©ãŒã¡ãã»ãŒãžã§èšè¿°ããŠãããããJestã§èŠã€ãããªãã£ãã®ã¯éåžžã«æ®å¿µã§ãã
@SimenBç³ãèš³ãããŸããããä»æããªãã®ã¡ãã»ãŒãžã«æ°ã¥ããã ãã§ãïŒ
ã¯ããããã¯ãŠãŒã¶ãŒã©ã³ãã§å®è¡å¯èœã§ããããã¯ã¢ããããŠjest-expect-message
ãšããŠãªãªãŒã¹ããŸããhttps://github.com/mattphillips/jest-expect-message
ãã£ãŒãããã¯æè¿ïŒsmileïŒ
çŽ æŽãããããããããŠãããŠããããšãïŒ
@cpojer
ãããããŸã圹ã«ç«ããªããšæãçç±ã¯ããšã³ãžãã¢ããã¹ããæžãã®ã«æéãç¡é§ã«ããããªãããã§ãã 圌ãã«ãšã£ãŠãããé£ãââãããããã«ç§ãã¡ãããããšã¯ããã ããæªããã¹ãã«ã€ãªããã§ãããã
2ã€ã®ããšïŒ
Jestã«æ¥ãåã«ãç§ã¯Mocha / ChaiãšããŒãã䜿çšããŸããããããã¯æ¬åœã«å€§ããªåé¡ã§ãã ã«ã¹ã¿ã ã¡ãã»ãŒãžã®ãµããŒããæåŸ ããã«ã¯ã©ãããã°ããã§ããïŒ
ã«ã¹ã¿ã ãããã£ãŒãäœæããããã«expect.extendãæå®ãããšãæåã®åŒæ°ã§é¿ããããšããŠãããã®ãšãŸã£ããåãããã«èãããŸããããšã³ãžãã¢ã¯ãã¹ãã®äœæã«æéãç¡é§ã«ããããªããã
åäœãã¹ããéããŠè¡çªå·ã確èªããã®ã¯ç°¡åãªã®ã§ãOPã®ãŠãŒã¹ã±ãŒã¹ã¯æ°ã«ãªããŸããã
ç§ãæ©ãŸããŠãããŠãŒã¹ã±ãŒã¹ã¯ããã¹ãå ã«ã«ãŒããããå Žåã§ããããšãã°ãåæåã®ãã¹ãŠã®å€ããã¹ãããå Žåã§ããããšãã°ã次ã®ããã«ãªããŸãã
it("Should contain at least one word of every wordType", () => {
for (const wordType of wordTypes) {
expect(words.find((word) => word.wordType === wordType)).toBeTruthy();
}
});
ããã倱æããå Žåãã©ã®wordTypeå€ã倱æãããããããŸããã
ç§ã®åé¿çã¯ãããããã¹ãçµæãå«ãã¡ãã»ãŒãžã«çœ®ãæããã¡ãã»ãŒãžã«æåŸ ããããã¹ãçµæãå«ãŸããããšãæåŸ ããããšã§ããïŒã€ãŸããtrueïŒã 倱æããå ŽåãJestã¯è¿œå æ å ±ãå«ãã¡ãã»ãŒãžãåºåããŸãã
expect(`${wordType} ${!!words.find((word) => word.wordType === wordType)}`).toEqual(`${wordType} ${true}`);
ãžã§ã¹ãã¯ãããå°å·ããŸã...
expect(received).toEqual(expected)
Difference:
- Expected
+ Received
- 6 true
+ 6 false
...ããã¯ã倱æãããšãã«wordTypeã6ã§ãã£ãããšã瀺ããŠããŸãã
ãŸãã¯ãã£ãšèªã¿ãããããã«...
if (!words.find((word) => word.wordType === wordType)) {
expect(`Didn't find a word with wordType '${wordType}'`).toEqual(null);
}
@cwellsxã¯ã test.each
ã䜿çšããŠãã©ã¡ãŒã¿ãŒåããããã¹ãããã§ãã¯ã¢ãŠãããŸããããã«ãããåwordTypeã¯ãïŒå€ã«åºã¥ããŠïŒèª¬æçãªã¿ã€ãã«ãæã€ç¬ç«ãããã¹ãã«ãªããŸãã
ããã¯ã次ã®ãããªãã¹ãã§éåžžã«åœ¹ç«ã¡ãŸãã
test("compare ArrayBufferCursors", () => {
const orig: ArrayBufferCursor;
const test: ArrayBufferCursor;
expect(test.size).toBe(orig.size);
while (orig.bytes_left) {
expect(test.u8()).toBe(orig.u8());
}
});
ä»ã®ãšãããArrayBufferCursorã®äžéšã®ãã€ããééã£ãŠããããšããããããŸããããã©ããééã£ãŠããã®ãããããŸããã ã³ã³ããã¹ããšããŠã€ã³ããã¯ã¹ãè¿œå ã§ãããšããããã°ãã¯ããã«ç°¡åã«ãªããŸãã ãããããããšã«ãããã§åé¿çãæ瀺ãã人ãããŸããããããã¯ãã¹ãŠéããŠé ãã§ãã
@ rickhanlonii ãjestã®ã¡ã³ããã³ã¹ã³ã¹ããåæžããããšã®ããšã§ãããã³ã¡ã³ãã§æäŸãããªãã·ã§ã³ã«ãããä»ã®ãã¹ãŠã®ãããžã§ã¯ãã®åäœãã¹ãã®ã¡ã³ããã³ã¹ãå¢å ããŸãã toEqual
ã䜿çšããŠã¢ãµãŒã·ã§ã³ã説æãããå Žåããã以å€ã®ç¹ã§ã¯å®å
šã«ååã§ãããã«ã¹ã¿ã ãããã£ãŒãå°å
¥ããããšãæ¬åœã«ææ¡ããŠããŸããïŒïŒ
it.each
ã圹ç«ã€å埩ãã¹ãã®å ŽåããããŸãããã¢ãµãŒã·ã§ã³ã«é¢ããåçŽãªã³ã¡ã³ãã«äžèŠãªã³ãŒããè¿œå ããå¿
èŠãããããããã®ãã¹ããã¬ãŒã ã¯ãŒã¯ã®äœ¿çšãé£ãããªããŸãã
ãã®è°è«ãšjest-expect-message
ã®åºçŸã¯ããžã£ã¹ãã³ã®beforeAll
ã®åé¡ã«ã€ããŠæãåºãããŠãããŸã...
ããã§OPã®èŠæ±ã誀解ããŠããå¯èœæ§ããããŸããã解決ããããšããŠãã®åé¡ã®ã¹ã¬ããã«ãã©ãçããåé¡ã¯ãåçŽãªtry / catch
ãšjest.expect
ã®ã©ãããŒã䜿çšããã ãã§è§£æ±ºãããŸããã ç§ãããããã£ãã®ã¯ãç§ãæåŸ
ãããªããžã§ã¯ããšåãåã£ããªããžã§ã¯ãã®å
šäœãšããã®éèŠæ§ã説æããããã€ãã®åºæ¬çãªãã°ãèšé²ããããšã ãã§ããã ãã¡ããããããæ¡åŒµããŠãã»ãŒãã¹ãŠã®ããšãå®è¡ã§ããŸãã
ããã®æãäžè¬çãªããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
in some test utility file...
const myExpect = (expectFn, errorCallback) => {
try {
expectFn();
} catch (err) {
errorCallback();
throw new Error(err);
}
};
// in the actual test suite...
const context = { hello: "world", results, expected };
myExpect(
() => expect(results).toEqual(expected),
() => console.error("[Error] -- context:", JSON.stringify(context))
);
+1
ããã«ã¡ã¯ãç§ããã®æ©èœã倧奜ãã§ãã ããã¯ç§ã®äººçããšãŠã楜ã«ããŠãããã§ãããã
æãåèã«ãªãã³ã¡ã³ã
ãã®è°è«ãšãã®ãªããžããªãããç§ã¯çŽ æŽããããŠæå³ã®ãããã®ã¯æ¬¡ã®ããã«ãªããšæããŸãïŒ
䜿çšæ³ã¯
because
ã®ãã®ãšäŒŒãŠããŸãããæå³çã«æå³ããããŸãããããæ°ã«å ¥ã£ããã
since
æ©èœãè¿œå ããŠPRãè¡ãããšãã§ãããããããŸããã