Unit Testing in JavaScript with MVC and QUnit
Upcoming SlideShare
Loading in...5
×
 

Unit Testing in JavaScript with MVC and QUnit

on

  • 6,572 views

While more and more application code move from the back-end to a JavaScript-based front-end, we still need to test this code efficiently. Testing JavaScript is often done using browser automation ...

While more and more application code move from the back-end to a JavaScript-based front-end, we still need to test this code efficiently. Testing JavaScript is often done using browser automation frameworks, but system-level testing is slow and brittle.

Here we present a way to structure your JavaScript application according to the Model-View-Controller (MVC) design pattern and how this enables us to write unit tests for a large part of the application logic, using a testing framework like QUnit.

Sample source code available at http://www.zealake.com/public/javascript-unit-testing.zip

Statistics

Views

Total Views
6,572
Views on SlideShare
6,303
Embed Views
269

Actions

Likes
2
Downloads
44
Comments
0

6 Embeds 269

http://www.zealake.com 238
http://www.linkedin.com 26
http://trunk.ly 2
url_unknown 1
https://twimg0-a.akamaihd.net 1
http://www.slashdocs.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Unit Testing in JavaScript with MVC and QUnit Unit Testing in JavaScript with MVC and QUnit Presentation Transcript

  • Unit Testing in JavaScript with MVC and QUnitLars ThorupZeaLake Software ConsultingJune 14, 2011
  • Who is Lars Thorup?● Software developer● Coach: Automated testing and other agile practices● Advisor: Assesses software projects and companies● Founder and CEO of BestBrains and ZeaLake
  • Agenda● Sample application under test● How to use QUnit● Asynchronuous testing● How to use Model-View-Controller● Assumes knowledge about JavaScript● Assumes knowledge about unit testing
  • JavaScript must be tested in the browser
  • Example app: Collaborative Dialog● Front end entirely in JavaScript● Back end service methods implemented in C#
  • How do tests look like?● util.test.html● ok(actual, message)● equal(actual, expected, message)● same(actual, expected, message) ● deep equivalence● raises(expected, function, message)
  • How to modularize tests?● view.test.html● module(name, fixture)● all following tests will have this being a newly created fixture object with setup() and teardown() run before and after the test
  • Testing ajax● svc.test.html● call expect(number-of-assertions) to verify that callbacks was actually called● call stop(timeout) before first ajax call● call start() when test is complete ● typically inside ajax callback● if more than one asynchronous call in one test: ● call stop() before each ● call start() in callback of each
  • Make your JavaScript testable● MVC design pattern: Model - View - Controller● Dependency injection● Isolated testing controller view model svc
  • View● view.js controller ● injected html ● load html page from the server ● html becomes directly stylable view model● Responsibilities svc ● manipulate html ● generate html from templates ● dispatch events to listeners ● nothing more!● References ● a set of event listeners (typically the controller)
  • Controller● controller.js controller● Responsibilities ● handle all events from the view model view ● poll model for change events if relevant svc ● convert events to commands against the model ● repaint strategy ● error handling strategy● References ● the model (to execute commands, polling) ● the view (to do repainting)
  • Model● model.js controller● Responsibilities ● cache state to minimize round view model trips ● provide view and controller with a useful interface of the svc data model● References ● the service proxy
  • Service Proxy● svc.js controller● Responsibilities ● provide a javascript api view model mapping of the server api● References svc ● the physical server via ajax
  • Testing the view● view.test.js test● Inject ● controllerStub ● canvas controllerStub● Invoke methods view● Assert ● canvas ● controllerStub
  • Testing the controller● controller.test.js test● Inject ● viewStub controller ● modelStub● Invoke methods viewStub modelStub● Assert ● viewStub ● modelStub
  • Testing the model● model.test.js test● Inject ● serverStub model● Invoke methods● Assert svcStub ● state ● serverStub
  • Testing the service proxy● svc.test.js test● Invoke methods● Assert ● results svc
  • Callbacks in JavaScript● Ajax means asynchronous ● Server methods become asynchronous ● Model methods become asynchronous ● To return a value you must supply a callback● Error handling ● Include in every callback
  • this in JavaScript● Avoid using this in callbacks, since this probably refers to the object that invokes the callback, not the object that contains the code for the callback.● Instead use jQuerys $proxy() method ● Example: controller.js
  • Bootstrap● bootstrap() function ● see collabForm.js● creates model, view and controller and ties them together● start polling engine (if relevant)● called by onload or $(document).ready() ● see Index.aspx
  • Run tests on build server● QUnit tests needs to run in a browser● On WIndows, the browser requires a WinStation ● So the build server must be logged on at all times for this to work● Hard to avoid tests that hang● Consider running tests manually instead
  • Testing the backend● Test your webservices● Use QUnit and assert on the returned JSON ● Or use your backend testing tool
  • Real World Example● WizerPro, in JavaScript, using MVC pattern
  • Further reading● Documentation ● http://docs.jquery.com/Qunit● Book ● "Test-Driven JavaScript Development", Christian Johansen● QUnit Presentation ● http://benalman.com/talks/unit-testing-qunit.html
  • Future meetups● TDD coding dojo with C++ and Ruby ● Thursday June 24th (in a week!)
  • Feedback● Give your evaluation at meetup.com