ใใฃใจ้ข็ฝใใใใใใซใใใใใฎใใใคใใฏๅ้กใณใผใใจในใใคใฉใผใฎๅฝขใงใใฌใผใ ๅใใใฆใใใใใใ้ใใจใๅ้กใไฝใงใใฃใใใใใใใพใใ ใใฎใใใใพใใณใผใใ่ฆใฆใใจใฉใผใ่ฆใคใใฆใใใในใใคใฉใผใ้ใใใจใใๅงใใใพใใ ๅ้กใฎ่งฃๆฑบ็ญใฏ็คบใใใพใใใ่ชๅใง่ใใใใจใๆๆกใใพใใ ๆ ใ่ ใ ใใใ ใชในใใฎ้ ๅบใซใฏๆทฑใๆๅณใฏใใใพใใใใใใฏใ่กใพใฟใใฎๆถใซใชใฃใใใใใ็จฎ้กใฎๅฎ้ใฎๅ้กใๆใๅบใใใทใผใฑใณในใซใใใพใใใ ็ขบใใซๅคใใฎใใจใฏใใชใใซใฏๆใใใชใใใซๆใใพใใใ็ต้จ่ฑๅฏใช้็บ่ ใงใใ่ชคใฃใฆใใฎใใใชใณใผใใๆธใใใจใใงใใพใใ
่กใใพใใใใ
0.ใในใใฎๆฌ ๅฆ
ๅฅๅฆใชใใจใซใใในใใๆธใใจ้็บ้ๅบฆใไฝไธใใใจๅคใใฎไบบใใใพใ ใซไฟกใใฆใใพใใ ใใกใใใใในใใฎไฝๆใจใในใๅฏ่ฝใชใณใผใใฎไฝๆใซใใๅคใใฎๆ้ใ่ฒปใใๅฟ ่ฆใใใใใจใฏๆใใใงใใ ใใใใใใฎๅพใใใใฐใใฆ้่กใใๅพใฏใใใใซๅคใใฎๆ้ใ่ฒปใใๅฟ ่ฆใใใใพใ...
1.ใในใๅฎ่กใฎๆฌ ๅฆ
ๅฎ่กใใชใใในใใใพใใฏๆใ ๅฎ่กใใใในใใใใๅ ดๅใใใใฏใในใใใชใใใใงใใ ใใใซๆชใใใจใซใๅคใใในใใณใผใใจ่ชคใฃใใปใญใฅใชใใฃๆ่ญใใใใพใใ ใณใผใใใใฉใณใใซใใใทใฅใใใจใใฏใๅฐใชใใจใCIใใญใปในใงใในใใๅฎ่กใใๅฟ ่ฆใใใใพใใ ใใ่ฏใ-ใใใทใฅใฎๅใซใญใผใซใซใงใ ใใใใใฐใ้็บ่ ใฏๆฐๆฅใงใใซใใซๆปใๅฟ ่ฆใใชใใชใใ็ตๅฑใฎใจใใใใใซใใซๅๆ ผใใพใใใงใใใ
2.ใซใใฌใใธใฎๆฌ ๅฆ
ใใใงใใในใใฎใซใใฌใใธใใใใใชใๅ ดๅใฏใไปใใ่ชญใฟใซ่กใใพใใใใ ๅฐใชใใจใใฆใฃใญใใใฃใข ใ ใใไปฅๅคใฎๅ ดๅใใในใใงใฏใใใงใใฏใใใณใผใใฎ10๏ผ ใฎๅผทๅบฆใงใในใใใๅฏ่ฝๆงใ้ซใใชใใพใใ ้ ใใๆฉใใใใใชใใฏ้้ใใชใใใใซ่ธใฟ่พผใใงใใใใ ใใกใใใใณใผใใ100๏ผ ็ถฒ็พ ใใฆใใๅฎๅ จใซๆญฃใใใใจใไฟ่จผใใใใใงใฏใใใพใใใใๆฝๅจ็ใชใจใฉใผใใฏใใใซๅคใ่กจ็คบใใใใใใใซใใฌใใธใใชใใใใใฏใใใซๅชใใฆใใพใใ Node.JSใฎๆๆฐใใผใธใงใณใใใใ่ชญใใใใฎ็ตใฟ่พผใฟใใผใซใๆใฃใฆใใใฎใไธๆ่ญฐใงใฏใใใพใใใ ไธ่ฌ็ใซใๅ ฑ้ใฎใใใใฏใฏๆทฑใใ้ๅธธใซๅ จไฝ่ซ็ใงใใใ็งใฏใใใซใคใใฆๆทฑใๅ ฅใใใใพใใ-็งใฏๅคใใซใคใใฆๅฐใ่จใใใใงใใ
3ใ
const {assert} = require('chai'); const Promise = require('bluebird'); const sinon = require('sinon'); class MightyLibrary { static someLongFunction() { return Promise.resolve(1); // just imagine a really complex and long function here } } async function doItQuickOrFail() { let res; try { res = await MightyLibrary.someLongFunction().timeout(1000); } catch (err) { if (err instanceof Promise.TimeoutError) { return false; } throw err; } return res; } describe('using Timeouts', ()=>{ it('should return false if waited too much', async ()=>{ // stub function to emulate looong work sinon.stub(MightyLibrary, 'someLongFunction').callsFake(()=>Promise.delay(10000).then(()=>true)); const res = await doItQuickOrFail(); assert.equal(res, false); }); });
ใใใงไฝใๆชใใฎ
ๅไฝใในใใฎใฟใคใ ใขใฆใใ
ใใใงใฏใ้ทใๆไฝใฎใฟใคใ ใขใฆใ่จญๅฎใๅฎ้ใซๆฉ่ฝใใใใจใ็ขบ่ชใใใใฃใใฎใงใใ ไธ่ฌใซใใใใฏใจใซใใใปใจใใฉๆๅณใใใใพใใ-ๆจๆบใฉใคใใฉใชใใใงใใฏใใในใใงใฏใใใพใใ-ใใใใใใฎใณใผใใฏๅฅใฎๅ้กใซใคใชใใใพใ-ใในใใฎๅฎ่กๆ้ใ1็ง้ๅขๅ ใใใพใใ ใใใฏใใใปใฉๅคใใฏใชใใใใซๆใใใพใ...ใใใใใใฎ็งๆฐใซใๅๆงใฎใในใใฎๆฐใ้็บ่ ใฎๆฐใ1ๆฅใใใใฎ่ตทๅๆฐใๆใใฆใใ ใใ...ใใใฆใใใฎใใใชใฟใคใ ใขใฆใใฎใใใซใๆฏๆฅใงใฏใชใใจใๆฏ้ฑไฝๆ้ใใฎไปไบใๅคฑใๅฏ่ฝๆงใใใใใจใ็่งฃใงใใพใใ
4ใ
const fs = require('fs'); const testData = JSON.parse(fs.readFileSync('./testData.json', 'utf8')); describe('some block', ()=>{ it('should do something', ()=>{ someTest(testData); }) })
ใใใงไฝใๆชใใฎ
ใในใใใญใใฏๅคใฎใในใใใผใฟใฎ่ชญใฟ่พผใฟใ
ไธ่ฆใใในใใใผใฟใใฉใใง่ชญใใใฏๅ้กใงใฏใชใใจๆใใใพใ-่ชฌๆใใใญใใฏใใพใใฏใขใธใฅใผใซ่ชไฝใ 2็ช็ฎใซใใ ใใใใไฝ็พใใฎใในใใใใใใใฎๅคใใๅคง้ใฎใใผใฟใไฝฟ็จใใฆใใใจๆณๅใใฆใใ ใใใ ใใใใใในใๅคใงใญใผใใใใจใใในใใฎ็ตไบใพใงใในใฆใฎใในใใใผใฟใใกใขใชใซๆฎใใๆ้ใ็ตใคใซใคใใฆใ่ตทๅใซใใๅคใใฎRAMใๆถ่ฒปใใใใในใใๅฎ่กใใใชใใชใใใจใใใใใพใใๆจๆบไฝๆฅญๆฉๆขฐใ
5ใ
const {assert} = require('chai'); const sinon = require('sinon'); class Dog { // eslint-disable-next-line class-methods-use-this say() { return 'Wow'; } } describe('stubsEverywhere', ()=>{ before(()=>{ sinon.stub(Dog.prototype, 'say').callsFake(()=>{ return 'meow'; }); }); it('should say meow', ()=>{ const dog = new Dog(); assert.equal(dog.say(), 'meow', 'dog should say "meow!"'); }); });
ใใใงไฝใๆชใใฎ
ใณใผใใฏๅฎ้ใซใฏในใฟใใซ็ฝฎใๆใใใใพใใ
ใใฃใจใใชใใฏใใใซใใฎใฐใใใ้้ใใ่ฆใพใใใ ใใกใใใๅฎ้ใฎใณใผใใงใฏใใใใฏใใใปใฉๆ็ฝใงใฏใใใพใใใใในใฟใใงใใณใฐใใฆใใใณใผใใ่ฆใใฎใงใไฝใใในใใใพใใใงใใใ
6ใ
const sinon = require('sinon'); const {assert} = require('chai'); class Widget { fetch() {} loadData() { this.fetch(); } } if (!sinon.sandbox || !sinon.sandbox.stub) { sinon.sandbox = sinon.createSandbox(); } describe('My widget', () => { it('is awesome', () => { const widget = new Widget(); widget.fetch = sinon.sandbox.stub().returns({ one: 1, two: 2 }); widget.loadData(); assert.isTrue(widget.fetch.called); }); });
ใใใงไฝใๆชใใฎ
ใในใ้ใฎไพๅญ้ขไฟใ
ไธ่ฆใใใจใๅฝผใใใใใซๆธใใฎใๅฟใใใใจใฏๆใใใงใ
afterEach(() => { sinon.sandbox.restore(); });
ใใใใๅ้กใฏใใใ ใใงใฏใชใใใในใฆใฎใในใใงๅใใตใณใใใใฏในใไฝฟ็จใใใใใจใงใใ ใพใใใในใๅฎ่ก็ฐๅขใๆททๅใใใใจใฏ้ๅธธใซ็ฐกๅใงใใใใใ็ธไบใซไพๅญใๅงใใพใใ ใใฎๅพใใในใใฏ็นๅฎใฎ้ ๅบใงใฎใฟๅฎ่กใใใใใใซใชใใพใใใไธ่ฌ็ใซใในใใใๅฏพ่ฑกใฏๆ็ขบใงใฏใใใพใใใ
ๅนธใใชใใจใซใsinon.sandboxใฏใใๆ็นใงๅปๆญขใใใฆ้ฃฒใพใใใใใใใฎใใใชๅ้กใฏใฌใฌใทใผใใญใธใงใฏใใงใใ็บ็ใใพใใใใใในใๅฎ่ก็ฐๅขใๆททไนฑใใใๆนๆณใฏไปใซใใใใใใใใๅพใง่ชฟๆปใใใฎใฏ่ฆ็ใงใใใฉใฎใณใผใใไธๆญฃใชๅไฝใฎ็ฝชใ็ฏใใฆใใพใใ ใจใใใงใๆ่ฟใใใใซใใขใคในใใกใฏใใชใผใใฎใใใชใใณใใฌใผใใซ้ขใใๆ็จฟใใใใพใใใใใใฏไธ่ฝ่ฌใงใฏใใใพใใใใใใฎใใใชๅ ดๅใซๅฝน็ซใคใใจใใใใพใใ
7.ใในใใใกใคใซใฎ่จๅคงใชใในใใใผใฟ
้ๅธธใซ้ ป็นใซใJSONใใกใคใซใใใใซใฏXMLใใฉใใปใฉๅทจๅคงใงใใใใใในใใซ็ดๆฅ่ฆใพใใใ ใชใใใใ่กใไพกๅคใใชใใฎใใฏๆใใใ ใจๆใใพใใ่ฆใใ็ทจ้ใใใใใใฎใฏ่ฆ็ใซใชใใพใใใใฉใฎIDEใงใๆ่ฌใใใใจใฏใใใพใใใ ๅคงใใชใในใใใผใฟใใใๅ ดๅใฏใใในใใใกใคใซใใๅใๅบใใพใใ
8ใ
const {assert} = require('chai'); const crypto = require('crypto'); describe('extraTests', ()=>{ it('should generate unique bytes', ()=>{ const arr = []; for (let i = 0; i < 1000; i++) { const value = crypto.randomBytes(256); arr.push(value); } const unique = arr.filter((el, index)=>arr.indexOf(el) === index); assert.equal(arr.length, unique.length, 'Data is not random enough!'); }); });
ใใใงไฝใๆชใใฎ
่ฟฝๅ ใในใใ
ใใฎๅ ดๅใ้็บ่ ใฏ่ชๅใฎไธๆใฎ่ญๅฅๅญใไธๆใซใชใใใจใ้ๅธธใซๅฟ้ ใใฆใใใใใใใฎใใงใใฏใไฝๆใใพใใใ ไธ่ฌใซใ็่งฃใงใใ้กๆ-ใใใใใใญใฅใกใณใใ่ชญใใใใใญใธใงใฏใใซ่ฟฝๅ ใใใซใใฎใใใชใในใใๆฐๅๅฎ่กใใใใจใใๅงใใใพใใ ใในใฆใฎใใซใใงๅฎ่กใใฆใๆๅณใใใใพใใใ
ใใฆใใในใใงใฎใฉใณใใ ใชๅคใฎใใฏใฟใคใฏใใใ่ชไฝใไธๅฎๅฎใชใในใใใผใญใใไฝๆใใใใจใซใใใ่ชๅ่ช่บซใ่ถณใงๆใค็ด ๆดใใใๆนๆณใงใใ
9.ใขใใฏใฎๆฌ ๅฆ
ใฉใคใใใผใฟใใผในใจ100ใฎใตใผใในใงใในใใๅฎ่กใใใใใใซๅฏพใใฆใในใใๅฎ่กใใๆนใใฏใใใซ็ฐกๅใงใใ
ใใใใ้ ใใๆฉใใๅฎใ็ตใณใพใ-ใใผใฟๅ้คใในใใฏ่ฃฝๅใใผในใงๅฎ่กใใใใใผใใใผใตใผใในใฎ็ ดๆใซใใไฝไธใๅงใใพใใใพใใฏใCIใซใฏๅฎ่กใใใใใฎใใผในใใใใพใใใ ไธ่ฌ็ใซใใขใคใใ ใฏ้ๅธธใซๅ จไฝ็ใงใใใๅๅใจใใฆ-ๅค้จใตใผใในใใจใใฅใฌใผใใงใใๅ ดๅใฏใใใใ่กใใใจใใๅงใใใพใใ
11ใ
const {assert} = require('chai'); class CustomError extends Error { } function mytestFunction() { throw new CustomError('important message'); } describe('badCompare', ()=>{ it('should throw only my custom errors', ()=>{ let errorHappened = false; try { mytestFunction(); } catch (err) { errorHappened = true; assert.isTrue(err instanceof CustomError); } assert.isTrue(errorHappened); }); });
ใใใงไฝใๆชใใฎ
่ค้ใชใจใฉใผใใใใฐใ
ใในใฆใๆชใใใใงใฏใใใพใใใใ1ใคใฎๅ้กใใใใพใใใในใใ็ช็ถใฏใฉใใทใฅใใๅ ดๅใๆฌกใฎๅฝขๅผใฎใจใฉใผใ่กจ็คบใใใพใใ
1) badCompare
should throw only my custom errors:
AssertionError: expected false to be true
+ expected - actual
-false
+true
at Context.it (test/011_badCompare/test.js:23:14)
ใใใซใๅฎ้ใซใฉใฎใใใชใจใฉใผใ็บ็ใใใใ็่งฃใใใซใฏใใในใใๆธใ็ดใๅฟ ่ฆใใใใพใใ ใใฎใใใไบๆใใชใใจใฉใผใ็บ็ใใๅ ดๅใฏใใใใ็บ็ใใใจใใไบๅฎใ ใใงใชใใใในใใซใคใใฆ่ฉฑใใฆใใใใใใซใใฆใใ ใใใ
12ใ
const {assert} = require('chai'); function someVeryBigFunc1() { return 1; // imagine a tonn of code here } function someVeryBigFunc2() { return 2; // imagine a tonn of code here } describe('all Before Tests', ()=>{ let res1; let res2; before(async ()=>{ res1 = await someVeryBigFunc1(); res2 = await someVeryBigFunc2(); }); it('should return 1', ()=>{ assert.equal(res1, 1); }); it('should return 2', ()=>{ assert.equal(res2, 2); }); });
ใใใงไฝใๆชใใฎ
beforeใใญใใฏใฎใในใฆใ
ใbeforeใใใญใใฏๅ ใฎใในใฆใฎๆไฝใๅฎ่กใใใitใๅ ใซใใงใใฏใฎใฟใๆฎใใฎใฏใฏใผใซใชใขใใญใผใใฎใใใงใใ
ใใใงใใชใใ
ใใฎๅ ดๅใใในใใฎๅฎ้ใฎๅฎ่กๆ้ใ่ฝไธใฎ็็ฑใใใใในใใซ้ขไฟใใใใฎใๅฅใฎใในใใซ้ขไฟใใใใฎใ็่งฃใงใใชใๆททไนฑใใใใใใงใใ
ใใใใฃใฆใใในใฆใฎใในใไฝๆฅญ๏ผๆจๆบใฎๅๆๅใ้คใ๏ผใฏใใในใ่ชไฝใฎๅ ้จใงๅฎ่กใใๅฟ ่ฆใใใใพใใ
13ใ
const {assert} = require('chai'); const moment = require('moment'); function someDateBasedFunction(date) { if (moment().isAfter(date)) { return 0; } return 1; } describe('useFutureDate', ()=>{ it('should return 0 for passed date', ()=>{ const pastDate = moment('2010-01-01'); assert.equal(someDateBasedFunction(pastDate), 0); }); it('should return 1 for future date', ()=>{ const itWillAlwaysBeInFuture = moment('2030-01-01'); assert.equal(someDateBasedFunction(itWillAlwaysBeInFuture), 1); }); });
ใใใงไฝใๆชใใฎ
ๆฅไปใง็ตใถใ
ใใใฏๆใใใช้้ใใฎใใใซใๆใใพใใใๆๆฅใฏๆฑบใใฆๆฅใชใใจไฟกใใฆใใ็ฒใใ้็บ่ ใฎ้ใงใๅฎๆ็ใซ็บ็ใใพใใ ๆจๆฅใฏ้ ่ชฟใ ใฃใใใซใใใไปๆฅใฏ็ช็ถไฝไธใใพใใ
ใใใใใฎๆฅไปใ้ ใใๆฉใใๆฅใใใจใๅฟใใชใใงใใ ใใ-ใใใใฃใฆใ `sinon.fakeTimers`ใฎใใใชใใฎใงๆ้ใจใใฅใฌใผใทใงใณใไฝฟ็จใใใใๅฐใชใใจใ2050ๅนดใฎใใใชใชใขใผใๆฅไปใ่จญๅฎใใฆใใ ใใ-ใใชใใฎๅญๅญซใๅทใคใใฆใใ ใใ...
14ใ
describe('dynamicRequires', ()=>{ it('should return english locale', ()=>{ // HACK : // Some people mutate locale in tests to chinese so I will require moment here // eslint-disable-next-line global-require const moment = require('moment'); const someDate = moment('2010-01-01').format('MMMM'); assert.equal(someDate, 'January'); }); });
ใใใงไฝใๆชใใฎ
ใขใธใฅใผใซใฎๅ็ใญใผใใ
Eslintใใๆใกใฎๅ ดๅใฏใใใใใๆขใซๅ็ไพๅญ้ขไฟใ็ฆๆญขใใฆใใใงใใใใ ใใฉใใใ
ๅคใใฎๅ ดๅใ้็บ่ ใฏใในใๅ ใงใฉใคใใฉใชใพใใฏใใพใใพใชใขใธใฅใผใซใ็ดๆฅใญใผใใใใใจใใฆใใใใจใใใใใพใใ ใใใใๅฝผใใฏไธ่ฌใซใrequireใใใฉใฎใใใซๆฉ่ฝใใใใ็ฅใฃใฆใใพใ-ใใใใๅฝผใใฏใใใพใง่ชฐใๆททไนฑใใฆใใชใใฏใชใผใณใชใขใธใฅใผใซใไธใใใใใใจใซใชใฃใฆใใใจใใๅนปๆณใๅฅฝใฟใพใใ
ใใฎไปฎๅฎใฏใใในใไธญใฎ่ฟฝๅ ใขใธใฅใผใซใฎใญใผใใ้ ใใใใใซๆชๅฎ็พฉใฎๅไฝใๅผใ่ตทใใใจใใ็นใงๅฑ้บใงใใ
15ใ
function someComplexFunc() { // Imagine a piece of really strange code here return 1; } describe('cryptic', ()=>{ it('success', ()=>{ const result = someComplexFunc(); assert.equal(result, 1); }); it('should not fail', ()=>{ const result = someComplexFunc(); assert.equal(result, 1); }); it('is right', ()=>{ const result = someComplexFunc(); assert.equal(result, 1); }); it('makes no difference for solar system', ()=>{ const result = someComplexFunc(); assert.equal(result, 1); }); });
ใใใงไฝใๆชใใฎ
็่งฃใงใใชใใในใๅใ
ๆใใใชใใจใซใใใใใใฆใใใฏใใงใใใญ๏ผ ใใใใๅคใใฎไบบใฏใในใใฎใใใซใใใใใใๅๅใๆธใใใจใๆฐใซใใชใใฎใงใใใใซใคใใฆ่จใใชใใใฐใชใใพใใ-็ตๆใจใใฆใ็นๅฎใฎใในใใๅคใใฎ็ ็ฉถใฎๅพใซใฎใฟ็่งฃใใใใจใๅฏ่ฝใงใใ
16ใ
const {assert} = require('chai'); const Promise = require('bluebird'); function someTomeoutingFunction() { throw new Promise.TimeoutError(); } describe('no Error check', ()=>{ it('should throw error', async ()=>{ let timedOut = false; try { await someTomeoutingFunction(); } catch (err) { timedOut = true; } assert.equal(timedOut, true); }); });
ใใใงไฝใๆชใใฎ
ในใญใผใใใใจใฉใผใฎๆค่จผใฎๆฌ ๅฆใ
ๅคใใฎๅ ดๅใ้ขๆฐใใจใฉใผใในใญใผใใใใจใ็ขบ่ชใใๅฟ ่ฆใใใใพใใ ใใใใใใใใ็งใใกใๆขใใฆใใใใญใคใใงใใใใฉใใใๅธธใซ็ขบ่ชใใๅฟ ่ฆใใใใพใ-ๅฅใฎๅ ดๆใงใไปใฎ็็ฑใงๅฅใฎใจใฉใผใในใญใผใใใใใจใ็ช็ถๅคๆใใๅฏ่ฝๆงใใใใใ...
17ใ
function someBadFunc() { throw new Error('I am just wrong!'); } describe.skip('skipped test', ()=>{ it('should be fine', ()=>{ someBadFunc(); }); });
ใใใงไฝใๆชใใฎ
็กๅนใชใในใใ
ใใกใใใใณใผใใใใงใซไฝๅบฆใๆใงใในใใใใฆใใใ็ทๆฅใซใญใผใซใใๅฟ ่ฆใใใใไฝใใใฎ็็ฑใงใในใใๆฉ่ฝใใชใๅ ดๅใ็ถๆณใๅธธใซ็บ็ใใๅฏ่ฝๆงใใใใพใใ ใใจใใฐใไปฅๅใซๆธใใๅฅใฎใในใใฎๆใใใช่ค้ใใฎใใใงใใ ใใใฆใใในใใฏใชใใซใชใใพใใ ใใใฏๆญฃๅธธใงใใ ๆญฃๅธธใงใฏใใใพใใ-ใในใใใชใณใซๆปใใฟในใฏใใใใซ่จญๅฎใใชใใงใใ ใใใ ใใใ่กใใชใใจใ็กๅนๅใใใใในใใฎๆฐใๅขใใใใใใฎใณใผใใฏๅธธใซๆไปฃ้ ใใซใชใใพใใ ๅฏไธใฎ้ธๆ่ขใๆฎใใพใง-ๆ ๆฒใ็คบใใใใใใในใฆใฎใในใใๆใใพใใใชใใชใใ้้ใใ็่งฃใใใใใใใไธๅบฆๆธใๆนใ้ใใใใงใใ
ใใใซใใฎใใใช้ธๆใๅบใฆใใพใใใ ใใใใฎใในใใฏใในใฆใในใใซๅๆ ผใใพใใใ่จญ่จไธ็ ดๆใใฆใใพใใ ใณใกใณใใใพใใฏใใฎใใใช้้ใใๅ้ใใใใใซไฝๆใใใชใใธใใชใซใชใใทใงใณใ่ฟฝๅ ใใพใใ