Rich Quick: JS Continuous integration
A lot of code was UI which isn't easy to test. Split UI code away from business logic to allow the business logic to be independently tested. Moving to Backbone.js to clearly separate the logic - mainly testing the models.
Evaluated several unit test frameworks including Qunit but settled on Jasmine which is closer to Ruby. Jasmine runs its test suite in the browser by including all your scripts into an HTML page.
In most cases the tests check that a function exists and executes without errors. This is mostly regression testing but as specific problems are found tests are written for these cases. As more code for business logic is added there are more detailed tests added.
Linting is not included in the tests but could be added.
There are some issues with what PhantomJS returns - stack traces aren't returned and there is some DOM weirdness going on. Jasmine fixtures are available to work with the DOM. CasperJS is a navigation scripting & testing utility built on top of PhantomJS.
This is a continuous build process, the act of using this as a regular part of the development process is continuous integration. If everyone is using this process as they develop then faults are spotted early and are easier to fix.