Simple training in node using our set of tools.
###Step 0 - Running something in node.
Clone this repo, then run git checkout step-0
Run node app
to execute the code in app.js.
node executes any javascript that will run on Google's V8 engine.
require
- node's method of importing and exporting functionality and objects between files or modules.
- node includes a set of built-in core modules. These can be "required" at any time.
- node's module can be referenced at any time.
- module.exports (alias exports) determines exactly what is returned when calling require on a file.
- This can be an object, function, string, etc.
- Calling require on a directory looks for a file called
index.js
at the root and gets its exports. - Require must use relative paths unless the module is a core module or is locted in the
node_modules
folder.
###Step 1 - Unit testing with mocha and chai
Run git checkout step-1 -f
Run npm install
. You should now have mocha and chai installed in your node_modules
folder.
Our next goal is to move into some TDD/BDD with the tools we're using for this platform.
- Run
npm test
to see all our unit tests located incalculator.test.js
fail. - Open calculator.js and try to make the unit tests pass!
- Write unit tests for calculator.divide(), then make them pass.
mocha - Our unit test runner.
chai - Our assertion library.
Chai provides 3 diffeent assertion formats:
- Assert
- Expect
- Should
We have decided to use the expect syntax in our platform, so stick to that.
###Step 2 - Mocking dependencies with sinon and proxyquire
Run git checkout step-2 -f
Run npm install
. You should now have sinonjs and proxyquire.
proxyquire - lets us inject dependencies that our modules are using.
sinon - lets us mock and stub functionality.
sinon-chai - Chai assertions for sinon.
Here we're going to use our square.js
file as a functionality to provide a square function to our calculator.
For step 2:
- In calculator.test.js, our calculator should not actually include the real square module. Use proxyquire for this.
- In calculator.test.js, our calculator should use sinon to create the stub for the square module function.
###Step 3 - Hosting in express.
Run git checkout step-3 -f
Run npm install express --save
to grab express. This adds it to your package.json file as well as installs it.
express - Web application framework. Built on top of connect.
supertest - Allows integration testing of http servers including express apps.
####Asynchronous unit testing Open the newly created app.test.js. Notice the unit test functions now contain a parameter (done). This parameter is a callback function to tell mocha the unit test is complete. Use this any time you're unit testing asynchronous code.
###Step 4 - Swagger.
Run git checkout step-4 -f
Run npm start
Navigate to localhost:1337/docs and check out swagger's ability to make API calls!
####Steps
- Open app.js. We now have express and our calculator.
- Create a new express app.
- Create a route in express to
/calc
that allows operations to be performed.- It should take a query string with the following parameters:
- op - add, multiple, divide, etc
- a - first operand
- b - second operand
- Example query string:
localhost:1337/calc?op=add&a=5&b=10
- It should take a query string with the following parameters:
- Listen on port 1337.
- Start node to host!
####Notes
To see the solution to any step 'n', do git checkout step-n-solved -f
###To-do
- Express body parser, middleware, etc
- nock
- promises A+ / q
- Jshint
- Istanbul code coverage