Normally JavaScript runs in the browser for websites. Node lets you run JavaScript outside of the browser.
NPM is basically what manages the libraries and other dependencies that our application will use.
npm initA package.json file
// --save-dev means this dependency will be saved in package.json
npm install --save-dev mocha// --save-dev means this dependency will be saved in package.json
npm install --save-dev chai{
"name": "hackutd-unit-testing",
"version": "1.0.0",
"description": "Unit testing workshop",
"main": "main.js",
"scripts": {
"start": "node main.js",
"test": "mocha test/ --recursive"
},
"author": "",
"license": "ISC",
"devDependencies": {
"chai": "^3.5.0",
"mocha": "^3.1.2"
}
}
module.exports = {
reverse(text) {
return text.split('').reverse().join('');
},
};
const assert = require('chai').assert;
const utils = require('../utils');
describe('utils', function () {
describe('reverse', function () {
it('reverses string', function () {
const result = utils.reverse('test');
assert.equal(result, 'tset');
});
});
});
npm testconst assert = require('chai').assert;
const utils = require('../utils');
describe('utils', function () {
describe('reverse', function () {
it('reverses string', function () {
const result = utils.reverse('test');
assert.equal(result, 'tset');
});
it('handles non-strings', function () {
const result = utils.reverse(0);
assert.equal(result, undefined);
});
});
});
module.exports = {
reverse(text) {
if (typeof text === 'string') {
return text.split('').reverse().join('');
}
return undefined;
}
};
module.exports = {
reverse(text) {
if (this.isString(text)) {
return text.split('').reverse().join('');
}
return undefined;
},
isString(value) {
return typeof value === 'string';
}
};
const assert = require('chai').assert;
const utils = require('../utils');
describe('utils', function () {
describe('reverse', function () {
it('reverses string', function () {
const result = utils.reverse('test');
assert.equal(result, 'tset');
});
it('handles non-strings', function () {
const result = utils.reverse(0);
assert.equal(result, undefined);
});
});
describe('isString', function () {
it('returns true for string', function () {
const result = utils.isString('text');
assert.equal(result, true);
});
it('returns false for non-strings', function () {
const result = utils.isString(0);
assert.equal(result, false);
});
});
});
module.exports = {
reverse(text) {
if (this.isString(text)) {
return text.split('').reverse().join('');
}
return undefined;
},
isString(value) {
return typeof value === 'string';
},
piglatin(message) {
const words = message.split(' ');
for (let i = 0; i < words.length; i++) {
words[i] = words[i].reverse();
words[i] = words[i] + 'ay'
}
const result = words.join(' ');
return result;
},
};
const assert = require('chai').assert;
const utils = require('../utils');
describe('utils', function () {
describe('reverse', function () {
it('reverses string', function () {
const result = utils.reverse('test');
assert.equal(result, 'tset');
});
it('handles non-strings', function () {
const result = utils.reverse(0);
assert.equal(result, undefined);
});
});
describe('isString', function () {
it('returns true for string', function () {
const result = utils.isString('text');
assert.equal(result, true);
});
it('returns false for non-strings', function () {
const result = utils.isString(0);
assert.equal(result, false);
});
});
describe('piglatin', function () {
it('converts sentence to piglatin', function () {
const result = utils.piglatin('Hello my name is');
assert.equal(result, 'Ollehay ymay emanay siay');
});
});
});
module.exports = {
reverse(text) {
if (this.isString(text)) {
return text.split('').reverse().join('');
}
return undefined;
},
isString(value) {
return typeof value === 'string';
},
piglatin(message) {
const words = message.toLowerCase().split(' ');
for (let i = 0; i < words.length; i++) {
words[i] = this.reverse(words[i]);
words[i] = words[i] + 'ay';
}
const result = words.join(' ');
const sentence = result.charAt(0).toUpperCase() + result.slice(1);
return sentence;
},
};
const assert = require('chai').assert;
const utils = require('../utils');
describe('utils', function () {
describe('reverse', function () {
it('reverses string', function () {
const result = utils.reverse('test');
assert.equal(result, 'tset');
});
it('handles non-strings', function () {
const result = utils.reverse(0);
assert.equal(result, undefined);
});
});
describe('isString', function () {
it('returns true for string', function () {
const result = utils.isString('text');
assert.equal(result, true);
});
it('returns false for non-strings', function () {
const result = utils.isString(0);
assert.equal(result, false);
});
});
describe('piglatin', function () {
it('converts sentence to piglatin', function () {
const result = utils.piglatin('Hello my name is');
assert.equal(result, 'Ollehay ymay emanay siay');
});
it('converts word to piglatin', function () {
const result = utils.piglatin('Hello');
assert.equal(result, 'Ollehay');
});
it('handles non-strings', function () {
const result = utils.piglatin(0);
assert.equal(result, '');
});
});
});
module.exports = {
reverse(text) {
if (this.isString(text)) {
return text.split('').reverse().join('');
}
return undefined;
},
isString(value) {
return typeof value === 'string';
},
piglatin(message) {
if (this.isString(message)) {
const words = message.toLowerCase().split(' ');
for (let i = 0; i < words.length; i++) {
words[i] = this.reverse(words[i]);
words[i] = words[i] + 'ay';
}
const result = words.join(' ');
const sentence = result.charAt(0).toUpperCase() + result.slice(1);
return sentence;
}
return undefined;
},
};
const utils = require('./utils');
const readline = require('readline');
const interface = readline.createInterface({
input: process.stdin,
output: process.stdout
});
interface.question('Enter a word: ', function (word) {
console.log('Reversed:', utils.reverse(word));
interface.question('Enter a sentence: ', function (sentence) {
console.log('Piglatin:', utils.piglatin(sentence));
process.exit();
});
});
Unit testing is about testing independent units of your application.
Acceptance testing is the complete opposite. It tests user interaction and application flow. So if you are building a website, you would simulate a user using your application (clicking on buttons, filling out forms) in your tests.
describe('posts page', function () {
it('should add new post', function() {
visit('/posts/new');
fillIn('input.title', 'My new post');
click('button.submit');
andThen(() => assert.equal(find('ul.posts li:first').text(), 'My new post'));
});
});
Integration testing is a middle ground between acceptance testing and unit testing.
Integration testing tests interactions between parts of your application. It doesn't test user flow like acceptance tests but on a website, for example, it could test how different UI components interact with each other.
A test you add once you fix a bug to ensure that bug doesn't happen again.
Writing your test cases first and then writing your function to pass those tests. You know exactly what your function should do and what cases it should support.