際際滷

際際滷Share a Scribd company logo
Javascript is
software too!
(so where are the unit tests?)
        Kerry Buckley  @kerryb
  FESuffolk lightning talk 25 March 2013
鞄岳岳沿://敬敬敬.鍖i界一姻.界看馨/沿鞄看岳看壊/壊温沿温姻艶厩看/4948914064
鞄岳岳沿://敬敬敬.鍖i界一姻.界看馨/沿鞄看岳看壊/庄乙看姻馨温噛庄界/299854107
UT                            No         Yes                                                        ut/)
                                                            No            [107] (http://lbrtw.com/javascript-unit-
                                                                                                                   Developed as a learning project
                                                                          test-framework-part-1)
     JSUnit             Yes        No         Yes           No            [108] (http://www.jsunit.net/)
                                                                                                                   JSUnit is no longer actively maintain
     Enhance JS         Yes                                                                                                                                ed
                                   No         Yes           No            [10 6]
     QUnit                                                                                                         Port of Enhance PHP
                                              Yes         Yes         [109] (http://qunitjs.com/)
                                                                                                                   jQuery test harness
     RhUnit                                                           [110]
                                              Yes         Yes
                                                                      (http://www.iankent.co.uk/rhunit/)           QUnit compatible Rhino/JUnit framew
    Crosscheck                                                                                                                                             ork
                                              No          Yes         [10 7]
    J3Unit                                                                                                         Browserless java-based framework
                                          Yes             No          [111] (http://j3unit.sourceforge.net/)
    Mocha               No     Yes                                   [112]
                                          Yes             Yes
                                                                     (http://visionmedia.github.com/moch
    JSNUnit                                                                                              a/)
                                          Yes             No         [10 8]
   YUI Test          Yes       Yes        Yes           Yes          [10 9]
   JSSpec
                                          Yes             No         [11 0]
   UnitTesting                                                                                                    Behaviour-driven development framew
                                          Yes                                                                                                              ork
                                                        No          [11 1]
                                                                                                                 script.aculo.us javascript test harness
   JSpec                                                            [113]
                                          Yes          Yes                                                       Highly readable BDD, 50+ matchers
                                                                    (http://visionmedia.github.com/jspec)                                             , DOM / framework independent,
                                                                                                                 async, rhino, node.js support and mo
                                                                                                                                                      re (no longer maintained)
   Jasmine                                                          [114]                                        BDD, framework independent, easy
                                         Yes           Yes                                                                                            integration with Ruby projects
                                                                    (http://pivotal.github.com/jasmine)          and continuous builds. Allows for bot
                                                                                                                                                       h DOM-less testing and
  screw-unit                                                                                                     asynchronous testing.
                                         Yes           No           [11 2]
                                                                                                                 Requires jQuery
  Test.Simple     No[11 3]    Yes        Yes           No          [11 4]                                       Write TAP-emitting unit tests in JavaSc
                                                                                                                                                        ript and run them in your
                                                                                                                browser.
  Test.More       No[1]       Yes        Yes           No          [11 5]                                       Write TAP-emitting unit tests in JavaSc
                                                                                                                                                       ript and run them in your
  TestCase                                                                                                      browser.
                                         Yes           No          [11 6]
 TestIt
                                         Yes          Yes          [11 7]
 jsUnitTest                                                                                                     Light-weight, non-polluting, and eas
                                         Yes                                                                                                         y to set up and use
                                                    Yes[11 8]
 JSTest                                                                                                         Based on TestCase but without the Pro
                                        Yes                                                                                                             totype dependency
                                                      No          [11 9]
                                                                                                                Light-weight, non-polluting browser-b
 JSTest.NET                                                                                                                                            ased framework
                                         No           Yes         [115] (http://jstest.codeplex.com)            Browserless JavaScript unit test runner
                                                                                                                                                        for use with MsTest, XUnit,
 jsUnity          Yes                                                                                           NUnit, etc.
                              No        Yes          Yes          [116] (http://jsunity.com/)
RhinoUnit                                                                                                      Context-agnostic (JavaScript, JScript
                                        No           Yes         [12 0]                                                                              (ASP/WSH), Rhino, etc.)
                                                                                                               Rhino-based framework that allows test
JasUnit                                                                                                                                                 s to be run in Ant
                  Yes         No        Yes          No          [12 1]                                        Light-weight framework. Part of a pro
                                                                                                                                                      ject that provides Mocks and
                                                                                                               IoC.)
FireUnit
                                        Yes          No          [117] (http://fireunit.org/)                  Testing framework that provides loggin
                                                                                                                                                        g and viewing within a new
                                                                                                               tab of Firebug.
Js-test-
driver            Yes                   Yes          No          [12 2]                                        The goal of JsTestDriver is to build a
                                                                                                                                                      JavaSc
Jasmine
Jasmine
describe "2 + 2", ->
  it "is 4", ->
    expect(2 + 2).toEqual 4




describe("2 + 2", function() {
  it("should be 4", function() {
    expect(2 + 2).toEqual(4);
  });
});
$ jasmine-headless-webkit -c

Running Jasmine specs...
.
PASS: 1 test, 0 failures, 0.003 secs.

Test ordering seed: --seed 2026
Jasmine
encrypt = ->
  plainText = $("#plain-text").val()
  $.get "/encrypt", {text: plainText}, update

update = (data) ->
  $("#encrypted-text").val data.text

$ ->
  $("#plain-text").keyup encrypt
source "https://rubygems.org"

...

group :development, :test do
  ...
  gem "jasmine-headless-webkit"
  gem "jasmine-spec-extras"
end
src_files:
  - ["application.js"]
helpers:
  - helpers/**/*
spec_files:
  - "**/*[Ss]pec.*"
src_dir:
- app/assets/javascripts
- vendor/assets/javascripts
spec_dir: spec/javascripts
describe "Encryptor", ->
  beforeEach ->
    loadFixtures "encryptor.html"

  describe ".update", ->
    ...




<input id="plain-text" />
<input id="encrypted-text" />
describe "Encryptor", ->
  beforeEach ->
    loadFixtures "encryptor.html"

  describe ".update", ->
    it "sets the #encrypted-text element's value to the
        supplied data's text attribute", ->
      update {text: "foo"}
      expect($("#encrypted-text").val()).toEqual "foo"
Running Jasmine specs...
F
FAIL: 1 test, 1 failure, 0.003 secs.

Encryptor .update sets the #encrypted-text
element's value to the supplied data's text
attribute. (...spec/javascripts/
encryptor_spec.coffee:3)

  ReferenceError: Can't find variable: update
// Generated by CoffeeScript 1.6.1
(function() {
  var encrypt, update;

  encrypt = function() {
     var plainText;
     plainText = $("#plain-text").val();
     return $.get("/encrypt", {
       text: plainText
     }, update);
  };

  update = function(data) {
     return $("#encrypted-text").val(data.text);
  };

  $(function() {
    return $("#plain-text").keyup(encrypt);
  });

}).call(this);
class Encryptor
  constructor: ->
    $("#plain-text").keyup @encrypt

  encrypt: =>
    plainText = $("#plain-text").val()
    $.get "/encrypt", {text: plainText}, @update

  update: (data) =>
    $("#encrypted-text").val data.text

$ ->
  window.encryptor = new Encryptor
describe ".encrypt", ->
  it "requests encryption of the #plain-text field,
      calling .update on success", ->

    $("#plain-text").val "foo"
    spyOn $, "get"

    window.encryptor.encrypt()

    expect($.get).toHaveBeenCalledWith "/encrypt",
      {text: "foo"}, window.encryptor.update
someObject = {doSomething: ->}

describe "an easy mistake to make", ->
  it "catches me out all the time", ->
    spyOn someObject, "doSomething"

    # Should fail  I'm not calling doSomething
    expect(someObject.doSomething).toHaveBeenCalled




Running Jasmine specs...
.
PASS: 1 test, 0 failures, 0.004 secs.

Test ordering seed: --seed 7220
Jasmine
Tuesday 2 April, 7pm
  The Brewery Tap

More Related Content

More from Kerry Buckley (20)

BDD with cucumber
BDD with cucumberBDD with cucumber
BDD with cucumber
Kerry Buckley
Ruby nooks & crannies
Ruby nooks & cranniesRuby nooks & crannies
Ruby nooks & crannies
Kerry Buckley
TDD refresher
TDD refresherTDD refresher
TDD refresher
Kerry Buckley
Javasccript MV* frameworks
Javasccript MV* frameworksJavasccript MV* frameworks
Javasccript MV* frameworks
Kerry Buckley
Tdd for BT E2E test community
Tdd for BT E2E test communityTdd for BT E2E test community
Tdd for BT E2E test community
Kerry Buckley
7li7w devcon5
7li7w devcon57li7w devcon5
7li7w devcon5
Kerry Buckley
What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)
Kerry Buckley
Functional ruby
Functional rubyFunctional ruby
Functional ruby
Kerry Buckley
MongoMapper lightning talk
MongoMapper lightning talkMongoMapper lightning talk
MongoMapper lightning talk
Kerry Buckley
Ruby
RubyRuby
Ruby
Kerry Buckley
Cloud
CloudCloud
Cloud
Kerry Buckley
The secret life of bees
The secret life of beesThe secret life of bees
The secret life of bees
Kerry Buckley
Background processing
Background processingBackground processing
Background processing
Kerry Buckley
Katas, Contests and Coding Dojos
Katas, Contests and Coding DojosKatas, Contests and Coding Dojos
Katas, Contests and Coding Dojos
Kerry Buckley
Rack
RackRack
Rack
Kerry Buckley
Doing REST Right
Doing REST RightDoing REST Right
Doing REST Right
Kerry Buckley
Kanban and Iterationless Working
Kanban and Iterationless WorkingKanban and Iterationless Working
Kanban and Iterationless Working
Kerry Buckley
Software Development Trends
Software Development TrendsSoftware Development Trends
Software Development Trends
Kerry Buckley
TDD
TDDTDD
TDD
Kerry Buckley
Kanban and Iterationless Working
Kanban and Iterationless WorkingKanban and Iterationless Working
Kanban and Iterationless Working
Kerry Buckley
BDD with cucumber
BDD with cucumberBDD with cucumber
BDD with cucumber
Kerry Buckley
Ruby nooks & crannies
Ruby nooks & cranniesRuby nooks & crannies
Ruby nooks & crannies
Kerry Buckley
Javasccript MV* frameworks
Javasccript MV* frameworksJavasccript MV* frameworks
Javasccript MV* frameworks
Kerry Buckley
Tdd for BT E2E test community
Tdd for BT E2E test communityTdd for BT E2E test community
Tdd for BT E2E test community
Kerry Buckley
What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)
Kerry Buckley
MongoMapper lightning talk
MongoMapper lightning talkMongoMapper lightning talk
MongoMapper lightning talk
Kerry Buckley
The secret life of bees
The secret life of beesThe secret life of bees
The secret life of bees
Kerry Buckley
Background processing
Background processingBackground processing
Background processing
Kerry Buckley
Katas, Contests and Coding Dojos
Katas, Contests and Coding DojosKatas, Contests and Coding Dojos
Katas, Contests and Coding Dojos
Kerry Buckley
Kanban and Iterationless Working
Kanban and Iterationless WorkingKanban and Iterationless Working
Kanban and Iterationless Working
Kerry Buckley
Software Development Trends
Software Development TrendsSoftware Development Trends
Software Development Trends
Kerry Buckley
Kanban and Iterationless Working
Kanban and Iterationless WorkingKanban and Iterationless Working
Kanban and Iterationless Working
Kerry Buckley

Recently uploaded (20)

Establish Visibility and Manage Risk in the Supply Chain with Anchore SBOM
Establish Visibility and Manage Risk in the Supply Chain with Anchore SBOMEstablish Visibility and Manage Risk in the Supply Chain with Anchore SBOM
Establish Visibility and Manage Risk in the Supply Chain with Anchore SBOM
Anchore
Trends Artificial Intelligence - Mary Meeker
Trends Artificial Intelligence - Mary MeekerTrends Artificial Intelligence - Mary Meeker
Trends Artificial Intelligence - Mary Meeker
Clive Dickens
Boosting MySQL with Vector Search -THE VECTOR SEARCH CONFERENCE 2025 .pdf
Boosting MySQL with Vector Search -THE VECTOR SEARCH CONFERENCE 2025 .pdfBoosting MySQL with Vector Search -THE VECTOR SEARCH CONFERENCE 2025 .pdf
Boosting MySQL with Vector Search -THE VECTOR SEARCH CONFERENCE 2025 .pdf
Alkin Tezuysal
Oracle Cloud and AI Specialization Program
Oracle Cloud and AI Specialization ProgramOracle Cloud and AI Specialization Program
Oracle Cloud and AI Specialization Program
VICTOR MAESTRE RAMIREZ
Azure vs AWS Which Cloud Platform Is Best for Your Business in 2025
Azure vs AWS  Which Cloud Platform Is Best for Your Business in 2025Azure vs AWS  Which Cloud Platform Is Best for Your Business in 2025
Azure vs AWS Which Cloud Platform Is Best for Your Business in 2025
Infrassist Technologies Pvt. Ltd.
Introduction to Internet of things .ppt.
Introduction to Internet of things .ppt.Introduction to Internet of things .ppt.
Introduction to Internet of things .ppt.
hok12341073
Oracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI ProfessionalOracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI Professional
VICTOR MAESTRE RAMIREZ
Domino IQ What to Expect, First Steps and Use Cases
Domino IQ  What to Expect, First Steps and Use CasesDomino IQ  What to Expect, First Steps and Use Cases
Domino IQ What to Expect, First Steps and Use Cases
panagenda
How Advanced Environmental Detection Is Revolutionizing Oil & Gas Safety.pdf
How Advanced Environmental Detection Is Revolutionizing Oil & Gas Safety.pdfHow Advanced Environmental Detection Is Revolutionizing Oil & Gas Safety.pdf
How Advanced Environmental Detection Is Revolutionizing Oil & Gas Safety.pdf
Rejig Digital
Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025
Safe Software
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Anish Kumar
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
The State of Web3 Industry- Industry Report
The State of Web3 Industry- Industry ReportThe State of Web3 Industry- Industry Report
The State of Web3 Industry- Industry Report
Liveplex
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdfEdge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
Solving Tomorrows AI Problems Today with Cadences Newest Processor, a Pre...
Solving Tomorrows AI Problems Today with Cadences Newest Processor, a Pre...Solving Tomorrows AI Problems Today with Cadences Newest Processor, a Pre...
Solving Tomorrows AI Problems Today with Cadences Newest Processor, a Pre...
Edge AI and Vision Alliance
Introduction to Typescript - GDG On Campus EUE
Introduction to Typescript - GDG On Campus EUEIntroduction to Typescript - GDG On Campus EUE
Introduction to Typescript - GDG On Campus EUE
Google Developer Group On Campus European Universities in Egypt
If You Use Databricks, You Definitely Need FME
If You Use Databricks, You Definitely Need FMEIf You Use Databricks, You Definitely Need FME
If You Use Databricks, You Definitely Need FME
Safe Software
Precisely Demo Showcase: Powering ServiceNow Discovery with Precisely Ironstr...
Precisely Demo Showcase: Powering ServiceNow Discovery with Precisely Ironstr...Precisely Demo Showcase: Powering ServiceNow Discovery with Precisely Ironstr...
Precisely Demo Showcase: Powering ServiceNow Discovery with Precisely Ironstr...
Precisely
Murdledescargadarkweb.pdfvolumen1 100 elementary
Murdledescargadarkweb.pdfvolumen1 100 elementaryMurdledescargadarkweb.pdfvolumen1 100 elementary
Murdledescargadarkweb.pdfvolumen1 100 elementary
JorgeSemperteguiMont
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
Establish Visibility and Manage Risk in the Supply Chain with Anchore SBOM
Establish Visibility and Manage Risk in the Supply Chain with Anchore SBOMEstablish Visibility and Manage Risk in the Supply Chain with Anchore SBOM
Establish Visibility and Manage Risk in the Supply Chain with Anchore SBOM
Anchore
Trends Artificial Intelligence - Mary Meeker
Trends Artificial Intelligence - Mary MeekerTrends Artificial Intelligence - Mary Meeker
Trends Artificial Intelligence - Mary Meeker
Clive Dickens
Boosting MySQL with Vector Search -THE VECTOR SEARCH CONFERENCE 2025 .pdf
Boosting MySQL with Vector Search -THE VECTOR SEARCH CONFERENCE 2025 .pdfBoosting MySQL with Vector Search -THE VECTOR SEARCH CONFERENCE 2025 .pdf
Boosting MySQL with Vector Search -THE VECTOR SEARCH CONFERENCE 2025 .pdf
Alkin Tezuysal
Oracle Cloud and AI Specialization Program
Oracle Cloud and AI Specialization ProgramOracle Cloud and AI Specialization Program
Oracle Cloud and AI Specialization Program
VICTOR MAESTRE RAMIREZ
Azure vs AWS Which Cloud Platform Is Best for Your Business in 2025
Azure vs AWS  Which Cloud Platform Is Best for Your Business in 2025Azure vs AWS  Which Cloud Platform Is Best for Your Business in 2025
Azure vs AWS Which Cloud Platform Is Best for Your Business in 2025
Infrassist Technologies Pvt. Ltd.
Introduction to Internet of things .ppt.
Introduction to Internet of things .ppt.Introduction to Internet of things .ppt.
Introduction to Internet of things .ppt.
hok12341073
Oracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI ProfessionalOracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI Professional
VICTOR MAESTRE RAMIREZ
Domino IQ What to Expect, First Steps and Use Cases
Domino IQ  What to Expect, First Steps and Use CasesDomino IQ  What to Expect, First Steps and Use Cases
Domino IQ What to Expect, First Steps and Use Cases
panagenda
How Advanced Environmental Detection Is Revolutionizing Oil & Gas Safety.pdf
How Advanced Environmental Detection Is Revolutionizing Oil & Gas Safety.pdfHow Advanced Environmental Detection Is Revolutionizing Oil & Gas Safety.pdf
How Advanced Environmental Detection Is Revolutionizing Oil & Gas Safety.pdf
Rejig Digital
Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025
Safe Software
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Anish Kumar
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
The State of Web3 Industry- Industry Report
The State of Web3 Industry- Industry ReportThe State of Web3 Industry- Industry Report
The State of Web3 Industry- Industry Report
Liveplex
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdfEdge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
Solving Tomorrows AI Problems Today with Cadences Newest Processor, a Pre...
Solving Tomorrows AI Problems Today with Cadences Newest Processor, a Pre...Solving Tomorrows AI Problems Today with Cadences Newest Processor, a Pre...
Solving Tomorrows AI Problems Today with Cadences Newest Processor, a Pre...
Edge AI and Vision Alliance
If You Use Databricks, You Definitely Need FME
If You Use Databricks, You Definitely Need FMEIf You Use Databricks, You Definitely Need FME
If You Use Databricks, You Definitely Need FME
Safe Software
Precisely Demo Showcase: Powering ServiceNow Discovery with Precisely Ironstr...
Precisely Demo Showcase: Powering ServiceNow Discovery with Precisely Ironstr...Precisely Demo Showcase: Powering ServiceNow Discovery with Precisely Ironstr...
Precisely Demo Showcase: Powering ServiceNow Discovery with Precisely Ironstr...
Precisely
Murdledescargadarkweb.pdfvolumen1 100 elementary
Murdledescargadarkweb.pdfvolumen1 100 elementaryMurdledescargadarkweb.pdfvolumen1 100 elementary
Murdledescargadarkweb.pdfvolumen1 100 elementary
JorgeSemperteguiMont
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
Ad

Jasmine

  • 1. Javascript is software too! (so where are the unit tests?) Kerry Buckley @kerryb FESuffolk lightning talk 25 March 2013
  • 4. UT No Yes ut/) No [107] (http://lbrtw.com/javascript-unit- Developed as a learning project test-framework-part-1) JSUnit Yes No Yes No [108] (http://www.jsunit.net/) JSUnit is no longer actively maintain Enhance JS Yes ed No Yes No [10 6] QUnit Port of Enhance PHP Yes Yes [109] (http://qunitjs.com/) jQuery test harness RhUnit [110] Yes Yes (http://www.iankent.co.uk/rhunit/) QUnit compatible Rhino/JUnit framew Crosscheck ork No Yes [10 7] J3Unit Browserless java-based framework Yes No [111] (http://j3unit.sourceforge.net/) Mocha No Yes [112] Yes Yes (http://visionmedia.github.com/moch JSNUnit a/) Yes No [10 8] YUI Test Yes Yes Yes Yes [10 9] JSSpec Yes No [11 0] UnitTesting Behaviour-driven development framew Yes ork No [11 1] script.aculo.us javascript test harness JSpec [113] Yes Yes Highly readable BDD, 50+ matchers (http://visionmedia.github.com/jspec) , DOM / framework independent, async, rhino, node.js support and mo re (no longer maintained) Jasmine [114] BDD, framework independent, easy Yes Yes integration with Ruby projects (http://pivotal.github.com/jasmine) and continuous builds. Allows for bot h DOM-less testing and screw-unit asynchronous testing. Yes No [11 2] Requires jQuery Test.Simple No[11 3] Yes Yes No [11 4] Write TAP-emitting unit tests in JavaSc ript and run them in your browser. Test.More No[1] Yes Yes No [11 5] Write TAP-emitting unit tests in JavaSc ript and run them in your TestCase browser. Yes No [11 6] TestIt Yes Yes [11 7] jsUnitTest Light-weight, non-polluting, and eas Yes y to set up and use Yes[11 8] JSTest Based on TestCase but without the Pro Yes totype dependency No [11 9] Light-weight, non-polluting browser-b JSTest.NET ased framework No Yes [115] (http://jstest.codeplex.com) Browserless JavaScript unit test runner for use with MsTest, XUnit, jsUnity Yes NUnit, etc. No Yes Yes [116] (http://jsunity.com/) RhinoUnit Context-agnostic (JavaScript, JScript No Yes [12 0] (ASP/WSH), Rhino, etc.) Rhino-based framework that allows test JasUnit s to be run in Ant Yes No Yes No [12 1] Light-weight framework. Part of a pro ject that provides Mocks and IoC.) FireUnit Yes No [117] (http://fireunit.org/) Testing framework that provides loggin g and viewing within a new tab of Firebug. Js-test- driver Yes Yes No [12 2] The goal of JsTestDriver is to build a JavaSc
  • 7. describe "2 + 2", -> it "is 4", -> expect(2 + 2).toEqual 4 describe("2 + 2", function() { it("should be 4", function() { expect(2 + 2).toEqual(4); }); });
  • 8. $ jasmine-headless-webkit -c Running Jasmine specs... . PASS: 1 test, 0 failures, 0.003 secs. Test ordering seed: --seed 2026
  • 10. encrypt = -> plainText = $("#plain-text").val() $.get "/encrypt", {text: plainText}, update update = (data) -> $("#encrypted-text").val data.text $ -> $("#plain-text").keyup encrypt
  • 11. source "https://rubygems.org" ... group :development, :test do ... gem "jasmine-headless-webkit" gem "jasmine-spec-extras" end
  • 12. src_files: - ["application.js"] helpers: - helpers/**/* spec_files: - "**/*[Ss]pec.*" src_dir: - app/assets/javascripts - vendor/assets/javascripts spec_dir: spec/javascripts
  • 13. describe "Encryptor", -> beforeEach -> loadFixtures "encryptor.html" describe ".update", -> ... <input id="plain-text" /> <input id="encrypted-text" />
  • 14. describe "Encryptor", -> beforeEach -> loadFixtures "encryptor.html" describe ".update", -> it "sets the #encrypted-text element's value to the supplied data's text attribute", -> update {text: "foo"} expect($("#encrypted-text").val()).toEqual "foo"
  • 15. Running Jasmine specs... F FAIL: 1 test, 1 failure, 0.003 secs. Encryptor .update sets the #encrypted-text element's value to the supplied data's text attribute. (...spec/javascripts/ encryptor_spec.coffee:3) ReferenceError: Can't find variable: update
  • 16. // Generated by CoffeeScript 1.6.1 (function() { var encrypt, update; encrypt = function() { var plainText; plainText = $("#plain-text").val(); return $.get("/encrypt", { text: plainText }, update); }; update = function(data) { return $("#encrypted-text").val(data.text); }; $(function() { return $("#plain-text").keyup(encrypt); }); }).call(this);
  • 17. class Encryptor constructor: -> $("#plain-text").keyup @encrypt encrypt: => plainText = $("#plain-text").val() $.get "/encrypt", {text: plainText}, @update update: (data) => $("#encrypted-text").val data.text $ -> window.encryptor = new Encryptor
  • 18. describe ".encrypt", -> it "requests encryption of the #plain-text field, calling .update on success", -> $("#plain-text").val "foo" spyOn $, "get" window.encryptor.encrypt() expect($.get).toHaveBeenCalledWith "/encrypt", {text: "foo"}, window.encryptor.update
  • 19. someObject = {doSomething: ->} describe "an easy mistake to make", -> it "catches me out all the time", -> spyOn someObject, "doSomething" # Should fail I'm not calling doSomething expect(someObject.doSomething).toHaveBeenCalled Running Jasmine specs... . PASS: 1 test, 0 failures, 0.004 secs. Test ordering seed: --seed 7220
  • 21. Tuesday 2 April, 7pm The Brewery Tap