SlideShare a Scribd company logo
Testable Javascript

   MARK ETHAN TROSTLERmark@zzo.com
                  @zzoass
      http://randomgoo.blogspot.com/
“If today were the last day
of my life, would I want to
 do what I am about to do
          today?”
KISS
Minimize Your Pain

•Write Small
•Write Simple
•Test Early
•Test Often
Write Small – Write Simple

 •Isolate code to test
 •Loosely couple
 dependencies
 •Be obvious
 •Optimize last
Test Early – Test Often



       Test Now
Explicit Dependencies
How things can go wrong…
// Call x.flub with twice z
function foo(z) {
varx = new X(); // Mmmmmtightly coupled…
    return x.flub(z*2);
}

// We want to test if x.flub was called with 14
var back = foo(7);
// But only have „back‟ to test!


                                            November 9, 2011
How can we test only our
                 code?
// Call x.flub with twice z
function foo(x, z) {
    return x.flub(z*2);
}

// Test x.flub got called with 14…
varx = new MockX(),
foo(x, 7);

If (x.called(„flub‟).with(14)) {
    // a winner!!
}
                                     November 9, 2011
Really see this in constructors…
// Ewww – not directly testable
function MyObject() {
this.x = new X();
}

MyObject.Prototpe.foo = function(z) {
  return this.x.flub(z*2);
}

var test = new MyObject(),
  back = test.foo(7) // cannot test what foo() did
                                           November 9, 2011
Inject It - Constructor
// Yea! Testable!
function MyObject(x) {
this.x = x;
}
MyObject.Prototpe.foo = function(z) {
    return this.x.flub(z*2);
}

varx = new MockX(), test = new MyObject(x);

test.foo(7);
If (x.called(„flub‟, with(14)) {
    // We tested only our function!
}                                             November 9, 2011
Inject It - Setter
// Yea! Testable!
function MyObject() { }
MyObject.prototpe.setX= function(x) {
this.x = x;
};
MyObject.prototpe.foo = function(z) {
      return this.x.flub(z*2);
};
varx = new MockX(), test = new MyObject();
test.setX(x);
test.foo(7);
If (x.called(„flub‟, with(14)) {
    // We tested only our function!
}                                            November 9, 2011
YUI
YUI Explicit Dependencies
YUI.add(„myObject‟, function(Y) {
     // Code you want to test
Y.MyObject = function() {
this.a = new Y.a();
this.b = new Y.b();
this.c = new Y.c();
    };
}, { requires: [ „a‟, „b‟, „c‟ ] });

YUI.use(„myObject‟, function(Y) {
    new Y.MyObject();
                                       November 9, 2011
});
Injecting YUI3 Dependencies??

YUI.add(„myObject‟, function(Y) {
     //// Code you want to test
Y.MyObject = function(a, b, c) {
this.a = a;
this.b = b;
this.c = c;
    };
});
YUI.use(„myObject‟, „a‟, „b‟, „c‟, function(Y) { // Prod
     new Y.MyObject(newY.a(), new Y.b(), new Y.c());
});
YUI.use(„myObject‟, „test‟, function(Y) { // Test
 new Y.MyObject(Y.Mock(), Y.Mock(), Y.Mock());
                                                           November 9, 2011
});
Isolating Dependencies
<script src =“yui3.js”></script>
<script src =“a.mock.js”></script>
<script src =“b.mock.js”></script>
<script src =“c.mock.js”></script>
<script src =“myObject.js”></script>

<script>
YUI.use(„myObject‟, function(Y) {
  new Y.MyObject();
</script>
                                       November 9, 2011
Injecting YUI3 Dependencies

YUI.add(„myObject‟, function(Y) {
     //// Code you want to test
Y.MyObject = function(a, b, c) {
this.a = a || new Y.a();
this.b = b|| new Y.b();
this.c = c|| new Y.c();
    };
}, { requires: [„a‟, „b‟, „c‟ ] });
YUI.use(„myObject‟, function(Y) { // Prod
     new Y.MyObject();
});
YUI.use(„myObject‟, „test‟, function(Y) { // Test
 new Y.MyObject(Y.Mock(), Y.Mock(), Y.Mock());
});                                                 November 9, 2011
Injecting YUI3 Dependencies
YUI.add(„myObject‟, function(Y) {
     //// Code you want to test
Y.MyObject = function() {
     }
Y.MyObject.prototype.setX = function(x) {
this.x = x;
     };
}, { requires: [„a‟, „b‟, „c‟ ] });
YUI.use(„myObject‟, function(Y) { // Prod
     new Y.MyObject();
});
YUI.use(„myObject‟, „test‟, function(Y) { // Test
 new Y.MyObject().setX(Y.Mock());
});                                                 November 9, 2011
Isolating Dependencies

YUI({
    modules: {
         a: {
fullpath: ‟/a-mock.js'
         }
      }
}).use('test', ‟myObject', 'console', function(
    Y) {
varobj = new Y.MyObject();
                                             November 9, 2011
});
Isolating Dependencies

YUI({
    filter: mock:
{ 'searchExp': “.js",
'replaceStr': "-mock.js" }
}).use('test', ‟myObject', 'console', function(
     Y) {
varobj = new Y.MyObject();
});

                                            November 9, 2011
Mock Objects
Mock Object

YUI().add(‟a', function(Y) {
    Y.A= function() {
var me = Y.Mock();
Y.Mock.expect(me, {
           method: ”render",
args: [„#toolbar‟]
       });
       return me;
    }
}, '1.0.0' ,{requires:['test']});   November 9, 2011
Testing with Mocked
           Dependencies

YUI().add(‟a', function(Y) {
    Y.A= function() { return Y.Mock(); };
}, '1.0.0' ,{requires:['test']});
YUI().use(„a‟, „test‟, „myObject‟, function(Y) {
var a = new Y.A();
Y.Mock.expect(a, {
            method: ”render",
args: [„#toolbar‟]
        });
    new MyObject(a).render();
    //// verify a.render(„#toolbar‟) was called
});                                                November 9, 2011
Implicit Dependencies
„Hidden‟ Dependencies
   Private functions are „hidden‟ dependencies
   Cannot test by definition!
   Make public? Are they part of the public API??
   Mock them out?? How??

 Refactor private function to be explicit
  dependencies
 Minimize their use – they cannot be tested
  directly
 Treated exactly like any other dependency
                                               November 9, 2011
Private functions

YOU CANNOT TEST
     THEM!


                      November 9, 2011
Don‟t forget browser
             dependencies!

YUI.add(„myObject‟, function(Y) {
     //// Code you want to test
Y.MyObject = function(window) {
this.window = window;
    };
myObject.prototype.fiddle = function(str) { return
       window.escape(str + „ FOOBIE‟); };
});

YUI.use(„myObject‟, function(Y) {
varwinMock = new WindowMock(),
myObj = new myObject(winMock);
myObj.fiddle(„foobie‟); // Check WindowMock!!
}
                                                     November 9, 2011
Recap
Explicit Deps

Problem: Public dependencies
Symptom: Explicitly declared
  dependencies
Cure:
• Eliminate tightly coupled code/use
  injection
• Pre-load mock‟ed versions of public
  dependencies

                                   November 9, 2011
Private Deps

Problem: Private dependencies
Symptom: Private methods and
  functions
Cure:
• Minimize private dependencies
• Make public dependency
• Use composition to pull in private stuff

                                      November 9, 2011
Browser Deps

Problem: Browser dependencies
Symptom: „window‟ or global scope
  usage
Cure:
• Eliminate tightly coupled code/use
  injection
• Pre-load mock‟ed versions of public
  dependencies

                                   November 9, 2011
Unit Testing Principles &
       Practices
All about dependency management

Identify dependencies and mock
  them out

Do not take your environment for
  granted

                              November 9, 2011
“Don‟t Be Foolish”
Resources

• https://github.com/zzo/JUTE
• trostler@yahoo-inc.com
• @zzoass
• http://randomgoo.blogspot.com/


                                November 9, 2011

More Related Content

What's hot (20)

PPTX
Get started with YUI
Adam Lu
 
PDF
meet.js - QooXDoo
Radek Benkel
 
PPTX
Zend server 6 using zf2, 2013 webinar
Yonni Mendes
 
PDF
JavaScript - From Birth To Closure
Robert Nyman
 
PPTX
Javascript And J Query
itsarsalan
 
PDF
Prototype
Aditya Gaur
 
PDF
Java script object model
James Hsieh
 
PDF
Scalable JavaScript Application Architecture
Nicholas Zakas
 
KEY
Javascript tid-bits
David Atchley
 
PDF
Advanced javascript
Doeun KOCH
 
PDF
JavaScript Patterns
Stoyan Stefanov
 
PPT
Web Optimization Summit: Coding for Performance
johndaviddalton
 
PDF
JDK Power Tools
Tobias Lindaaker
 
ODP
From object oriented to functional domain modeling
Codemotion
 
PPTX
Javascript Prototype Visualized
军 沈
 
PDF
Anonymous functions in JavaScript
Mohammed Sazid Al Rashid
 
PDF
Javascript 攻佔桌面應用程式:使用 electron
Yao Nien Chung
 
KEY
JavaScript Growing Up
David Padbury
 
PDF
Chaining et composition de fonctions avec lodash / underscore
Nicolas Carlo
 
PPT
Advanced JavaScript
Stoyan Stefanov
 
Get started with YUI
Adam Lu
 
meet.js - QooXDoo
Radek Benkel
 
Zend server 6 using zf2, 2013 webinar
Yonni Mendes
 
JavaScript - From Birth To Closure
Robert Nyman
 
Javascript And J Query
itsarsalan
 
Prototype
Aditya Gaur
 
Java script object model
James Hsieh
 
Scalable JavaScript Application Architecture
Nicholas Zakas
 
Javascript tid-bits
David Atchley
 
Advanced javascript
Doeun KOCH
 
JavaScript Patterns
Stoyan Stefanov
 
Web Optimization Summit: Coding for Performance
johndaviddalton
 
JDK Power Tools
Tobias Lindaaker
 
From object oriented to functional domain modeling
Codemotion
 
Javascript Prototype Visualized
军 沈
 
Anonymous functions in JavaScript
Mohammed Sazid Al Rashid
 
Javascript 攻佔桌面應用程式:使用 electron
Yao Nien Chung
 
JavaScript Growing Up
David Padbury
 
Chaining et composition de fonctions avec lodash / underscore
Nicolas Carlo
 
Advanced JavaScript
Stoyan Stefanov
 

Viewers also liked (9)

PDF
Высший арбитражный суд конкретизировал ответственность генеральных директор...
GreenfieldProject
 
ODP
Beginning Scala Svcc 2009
David Pollak
 
PDF
Supporting the complex requirements of a long-term project for whole brain em...
Randal Koene
 
PPT
Anforderungen an die Wissensrepräsentation im Social Semantic Web
Katrin Weller
 
PPT
Barometr Nastrojow Ekonomicznych Luty
prnews
 
PDF
Cоциальные сети. выбор оптимальной площадки для бренда автомобильной отрасли
PR News
 
PDF
Виральные кейсы Real Time PR
PR News
 
PPT
Behavioral Targeting Webinar
Remko Zuiderwijk
 
PDF
Lecture: Semantic Word Clouds
Marina Santini
 
Высший арбитражный суд конкретизировал ответственность генеральных директор...
GreenfieldProject
 
Beginning Scala Svcc 2009
David Pollak
 
Supporting the complex requirements of a long-term project for whole brain em...
Randal Koene
 
Anforderungen an die Wissensrepräsentation im Social Semantic Web
Katrin Weller
 
Barometr Nastrojow Ekonomicznych Luty
prnews
 
Cоциальные сети. выбор оптимальной площадки для бренда автомобильной отрасли
PR News
 
Виральные кейсы Real Time PR
PR News
 
Behavioral Targeting Webinar
Remko Zuiderwijk
 
Lecture: Semantic Word Clouds
Marina Santini
 
Ad

Similar to Testable Javascript (20)

PDF
Writing testable js [by Ted Piotrowski]
JavaScript Meetup HCMC
 
PDF
Unit testing JavaScript using Mocha and Node
Josh Mock
 
PPTX
Type mock isolator
MaslowB
 
PDF
Unit Testing JavaScript Applications
Ynon Perek
 
PDF
Understanding JavaScript Testing
jeresig
 
PDF
Js fwdays unit tesing javascript(by Anna Khabibullina)
Anna Khabibullina
 
PPTX
JS Frameworks Day April,26 of 2014
DA-14
 
PPTX
Zero to Testing in JavaScript
pamselle
 
PPTX
In search of JavaScript code quality: unit testing
Anna Khabibullina
 
PDF
CBDW2014 - MockBox, get ready to mock your socks off!
Ortus Solutions, Corp
 
PDF
Testing, Performance Analysis, and jQuery 1.4
jeresig
 
PDF
ITB 2023 10 Techniques for writing easy yet stupidly thorough unit tests_Dan ...
Ortus Solutions, Corp
 
PDF
We Are All Testers Now: The Testing Pyramid and Front-End Development
All Things Open
 
PDF
Advanced QUnit - Front-End JavaScript Unit Testing
Lars Thorup
 
PDF
Unit Testing - The Whys, Whens and Hows
atesgoral
 
PDF
Javascript - How to avoid the bad parts
Mikko Ohtamaa
 
PDF
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
Anup Singh
 
PPTX
Type mock isolator
MaslowB
 
PPTX
Security testing of YUI powered applications
dimisec
 
PPTX
Mocking
eleksdev
 
Writing testable js [by Ted Piotrowski]
JavaScript Meetup HCMC
 
Unit testing JavaScript using Mocha and Node
Josh Mock
 
Type mock isolator
MaslowB
 
Unit Testing JavaScript Applications
Ynon Perek
 
Understanding JavaScript Testing
jeresig
 
Js fwdays unit tesing javascript(by Anna Khabibullina)
Anna Khabibullina
 
JS Frameworks Day April,26 of 2014
DA-14
 
Zero to Testing in JavaScript
pamselle
 
In search of JavaScript code quality: unit testing
Anna Khabibullina
 
CBDW2014 - MockBox, get ready to mock your socks off!
Ortus Solutions, Corp
 
Testing, Performance Analysis, and jQuery 1.4
jeresig
 
ITB 2023 10 Techniques for writing easy yet stupidly thorough unit tests_Dan ...
Ortus Solutions, Corp
 
We Are All Testers Now: The Testing Pyramid and Front-End Development
All Things Open
 
Advanced QUnit - Front-End JavaScript Unit Testing
Lars Thorup
 
Unit Testing - The Whys, Whens and Hows
atesgoral
 
Javascript - How to avoid the bad parts
Mikko Ohtamaa
 
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
Anup Singh
 
Type mock isolator
MaslowB
 
Security testing of YUI powered applications
dimisec
 
Mocking
eleksdev
 
Ad

Recently uploaded (20)

PPTX
Appreciations - July 25.pptxdddddddddddss
anushavnayak
 
PDF
From Fossil to Future Green Energy Companies Leading India’s Energy Transitio...
Essar Group
 
DOCX
Apply for a Canada Permanent Resident Visa in Delhi with Expert Guidance.docx
WVP International
 
PPTX
The Rise of Artificial Intelligence pptx
divyamarya13
 
PPTX
Certificate of Incorporation, Prospectus, Certificate of Commencement of Busi...
Keerthana Chinnathambi
 
PDF
Equinox Gold - Corporate Presentation.pdf
Equinox Gold Corp.
 
PPTX
Lecture on E Business course Topic 24-34.pptx
MuhammadUzair737846
 
PDF
12 Oil and Gas Companies in India Driving the Energy Sector.pdf
Essar Group
 
DOCX
Andrew C. Belton, MBA Resume - July 2025
Andrew C. Belton
 
PPTX
Struggling to Land a Social Media Marketing Job Here’s How to Navigate the In...
RahulSharma280537
 
PDF
NewBase 26 July 2025 Energy News issue - 1806 by Khaled Al Awadi_compressed.pdf
Khaled Al Awadi
 
PDF
Using Innovative Solar Manufacturing to Drive India's Renewable Energy Revolu...
Insolation Energy
 
PDF
ANÁLISIS DE COSTO- PAUCAR RIVERA NEISY.pdf
neisypaucarr
 
PPTX
Andrew C. Belton, MBA Experience Portfolio July 2025
Andrew C. Belton
 
PPTX
Integrative Negotiation: Expanding the Pie
badranomar1990
 
PPTX
FINAL _ DB x Forrester x Workday Webinar Buying Groups July 2025 (1).pptx
smarvin1
 
PPTX
E-commerce and its impact on business.
pandeyranjan5483
 
PDF
Followers to Fees - Social media for Speakers
Corey Perlman, Social Media Speaker and Consultant
 
PDF
GenAI for Risk Management: Refresher for the Boards and Executives
Alexei Sidorenko, CRMP
 
PDF
Gregory Felber - An Accomplished Underwater Marine Biologist
Gregory Felber
 
Appreciations - July 25.pptxdddddddddddss
anushavnayak
 
From Fossil to Future Green Energy Companies Leading India’s Energy Transitio...
Essar Group
 
Apply for a Canada Permanent Resident Visa in Delhi with Expert Guidance.docx
WVP International
 
The Rise of Artificial Intelligence pptx
divyamarya13
 
Certificate of Incorporation, Prospectus, Certificate of Commencement of Busi...
Keerthana Chinnathambi
 
Equinox Gold - Corporate Presentation.pdf
Equinox Gold Corp.
 
Lecture on E Business course Topic 24-34.pptx
MuhammadUzair737846
 
12 Oil and Gas Companies in India Driving the Energy Sector.pdf
Essar Group
 
Andrew C. Belton, MBA Resume - July 2025
Andrew C. Belton
 
Struggling to Land a Social Media Marketing Job Here’s How to Navigate the In...
RahulSharma280537
 
NewBase 26 July 2025 Energy News issue - 1806 by Khaled Al Awadi_compressed.pdf
Khaled Al Awadi
 
Using Innovative Solar Manufacturing to Drive India's Renewable Energy Revolu...
Insolation Energy
 
ANÁLISIS DE COSTO- PAUCAR RIVERA NEISY.pdf
neisypaucarr
 
Andrew C. Belton, MBA Experience Portfolio July 2025
Andrew C. Belton
 
Integrative Negotiation: Expanding the Pie
badranomar1990
 
FINAL _ DB x Forrester x Workday Webinar Buying Groups July 2025 (1).pptx
smarvin1
 
E-commerce and its impact on business.
pandeyranjan5483
 
Followers to Fees - Social media for Speakers
Corey Perlman, Social Media Speaker and Consultant
 
GenAI for Risk Management: Refresher for the Boards and Executives
Alexei Sidorenko, CRMP
 
Gregory Felber - An Accomplished Underwater Marine Biologist
Gregory Felber
 

Testable Javascript

  • 1. Testable Javascript MARK ETHAN [email protected] @zzoass http://randomgoo.blogspot.com/
  • 2. “If today were the last day of my life, would I want to do what I am about to do today?”
  • 4. Minimize Your Pain •Write Small •Write Simple •Test Early •Test Often
  • 5. Write Small – Write Simple •Isolate code to test •Loosely couple dependencies •Be obvious •Optimize last
  • 6. Test Early – Test Often Test Now
  • 8. How things can go wrong… // Call x.flub with twice z function foo(z) { varx = new X(); // Mmmmmtightly coupled… return x.flub(z*2); } // We want to test if x.flub was called with 14 var back = foo(7); // But only have „back‟ to test! November 9, 2011
  • 9. How can we test only our code? // Call x.flub with twice z function foo(x, z) { return x.flub(z*2); } // Test x.flub got called with 14… varx = new MockX(), foo(x, 7); If (x.called(„flub‟).with(14)) { // a winner!! } November 9, 2011
  • 10. Really see this in constructors… // Ewww – not directly testable function MyObject() { this.x = new X(); } MyObject.Prototpe.foo = function(z) { return this.x.flub(z*2); } var test = new MyObject(), back = test.foo(7) // cannot test what foo() did November 9, 2011
  • 11. Inject It - Constructor // Yea! Testable! function MyObject(x) { this.x = x; } MyObject.Prototpe.foo = function(z) { return this.x.flub(z*2); } varx = new MockX(), test = new MyObject(x); test.foo(7); If (x.called(„flub‟, with(14)) { // We tested only our function! } November 9, 2011
  • 12. Inject It - Setter // Yea! Testable! function MyObject() { } MyObject.prototpe.setX= function(x) { this.x = x; }; MyObject.prototpe.foo = function(z) { return this.x.flub(z*2); }; varx = new MockX(), test = new MyObject(); test.setX(x); test.foo(7); If (x.called(„flub‟, with(14)) { // We tested only our function! } November 9, 2011
  • 13. YUI
  • 14. YUI Explicit Dependencies YUI.add(„myObject‟, function(Y) { // Code you want to test Y.MyObject = function() { this.a = new Y.a(); this.b = new Y.b(); this.c = new Y.c(); }; }, { requires: [ „a‟, „b‟, „c‟ ] }); YUI.use(„myObject‟, function(Y) { new Y.MyObject(); November 9, 2011 });
  • 15. Injecting YUI3 Dependencies?? YUI.add(„myObject‟, function(Y) { //// Code you want to test Y.MyObject = function(a, b, c) { this.a = a; this.b = b; this.c = c; }; }); YUI.use(„myObject‟, „a‟, „b‟, „c‟, function(Y) { // Prod new Y.MyObject(newY.a(), new Y.b(), new Y.c()); }); YUI.use(„myObject‟, „test‟, function(Y) { // Test new Y.MyObject(Y.Mock(), Y.Mock(), Y.Mock()); November 9, 2011 });
  • 16. Isolating Dependencies <script src =“yui3.js”></script> <script src =“a.mock.js”></script> <script src =“b.mock.js”></script> <script src =“c.mock.js”></script> <script src =“myObject.js”></script> <script> YUI.use(„myObject‟, function(Y) { new Y.MyObject(); </script> November 9, 2011
  • 17. Injecting YUI3 Dependencies YUI.add(„myObject‟, function(Y) { //// Code you want to test Y.MyObject = function(a, b, c) { this.a = a || new Y.a(); this.b = b|| new Y.b(); this.c = c|| new Y.c(); }; }, { requires: [„a‟, „b‟, „c‟ ] }); YUI.use(„myObject‟, function(Y) { // Prod new Y.MyObject(); }); YUI.use(„myObject‟, „test‟, function(Y) { // Test new Y.MyObject(Y.Mock(), Y.Mock(), Y.Mock()); }); November 9, 2011
  • 18. Injecting YUI3 Dependencies YUI.add(„myObject‟, function(Y) { //// Code you want to test Y.MyObject = function() { } Y.MyObject.prototype.setX = function(x) { this.x = x; }; }, { requires: [„a‟, „b‟, „c‟ ] }); YUI.use(„myObject‟, function(Y) { // Prod new Y.MyObject(); }); YUI.use(„myObject‟, „test‟, function(Y) { // Test new Y.MyObject().setX(Y.Mock()); }); November 9, 2011
  • 19. Isolating Dependencies YUI({ modules: { a: { fullpath: ‟/a-mock.js' } } }).use('test', ‟myObject', 'console', function( Y) { varobj = new Y.MyObject(); November 9, 2011 });
  • 20. Isolating Dependencies YUI({ filter: mock: { 'searchExp': “.js", 'replaceStr': "-mock.js" } }).use('test', ‟myObject', 'console', function( Y) { varobj = new Y.MyObject(); }); November 9, 2011
  • 22. Mock Object YUI().add(‟a', function(Y) { Y.A= function() { var me = Y.Mock(); Y.Mock.expect(me, { method: ”render", args: [„#toolbar‟] }); return me; } }, '1.0.0' ,{requires:['test']}); November 9, 2011
  • 23. Testing with Mocked Dependencies YUI().add(‟a', function(Y) { Y.A= function() { return Y.Mock(); }; }, '1.0.0' ,{requires:['test']}); YUI().use(„a‟, „test‟, „myObject‟, function(Y) { var a = new Y.A(); Y.Mock.expect(a, { method: ”render", args: [„#toolbar‟] }); new MyObject(a).render(); //// verify a.render(„#toolbar‟) was called }); November 9, 2011
  • 25. „Hidden‟ Dependencies  Private functions are „hidden‟ dependencies  Cannot test by definition!  Make public? Are they part of the public API??  Mock them out?? How??  Refactor private function to be explicit dependencies  Minimize their use – they cannot be tested directly  Treated exactly like any other dependency November 9, 2011
  • 26. Private functions YOU CANNOT TEST THEM! November 9, 2011
  • 27. Don‟t forget browser dependencies! YUI.add(„myObject‟, function(Y) { //// Code you want to test Y.MyObject = function(window) { this.window = window; }; myObject.prototype.fiddle = function(str) { return window.escape(str + „ FOOBIE‟); }; }); YUI.use(„myObject‟, function(Y) { varwinMock = new WindowMock(), myObj = new myObject(winMock); myObj.fiddle(„foobie‟); // Check WindowMock!! } November 9, 2011
  • 28. Recap
  • 29. Explicit Deps Problem: Public dependencies Symptom: Explicitly declared dependencies Cure: • Eliminate tightly coupled code/use injection • Pre-load mock‟ed versions of public dependencies November 9, 2011
  • 30. Private Deps Problem: Private dependencies Symptom: Private methods and functions Cure: • Minimize private dependencies • Make public dependency • Use composition to pull in private stuff November 9, 2011
  • 31. Browser Deps Problem: Browser dependencies Symptom: „window‟ or global scope usage Cure: • Eliminate tightly coupled code/use injection • Pre-load mock‟ed versions of public dependencies November 9, 2011
  • 32. Unit Testing Principles & Practices All about dependency management Identify dependencies and mock them out Do not take your environment for granted November 9, 2011
  • 34. Resources • https://github.com/zzo/JUTE • [email protected] @zzoass • http://randomgoo.blogspot.com/ November 9, 2011

Editor's Notes

  • #3: Enjoy writing new code, not debugging oldDebugging, fixing bugs, pulling out hair – debugging other people’s codeAs a dev what is the least favorite part of your day? Debugging / documentationWhat is the hardest part of your day? DebuggingMake life better for yourself and othersI like to code – I like to move forward &amp; get things done – debugging in moving backwardsDebugging can suck – debugging other peoples code does 4 sure
  • #4: Any kind of test – unit – integration - functional
  • #5: Get manager-speak out of the wayYou have heard all of this before from industry – from manager – from co-workers - there’s a reason: less pain for you – less pain for you managers – better codeWhy everyone all up in me about these things?You probably already agree it’s a good thingmanagers NEED you to succeedSmall = testableSimple = testable – minimize side effects – side effects harder to test – harder to capture – harder to explainLoosely coupled
  • #6: Lots of little – no bigPer function – test ONE THING AT A TIMEDo no create - injectIsolate what you want to testMocking out dependenciesCreating causes tight couplingClever comes later – if at all – don’t get cute or too clever – optimize LATERGet clever later
  • #7: NOWDon’t have to test first – just now
  • #8: Unit Testing = Isolating &amp; Mocking &amp; dealing with dependenciesYour code has dependencies you need to be aware of
  • #9: Everyone talks about tightly vs loosely coupled – this is tightly coupled!Basic dependency injection – otherwise tight dependency couplingWhat am I actually testing? This function needed to pass z*2 to X’s flub functionI pass in a mock &amp; an test it did the right thingTight coupling between foo() and X()
  • #10: Basic dependency injection – static languagesWhat am I actually testing? This function needed to pass z*2 to X’s flub functionI pass in a mock &amp; an test it did the right thing
  • #11: Basic dependency injectionWe really see this in constructors!!! Sometimes in methodsWhat are you gonna test?? Object X hidden away
  • #12: Constructor injection –a solution from static languages - We really see this in constructors!!! Sometimes in methodsConstruct objects with their dependencies – which can be goofy – the caller or constructor now needs to know the object’s dependencies!
  • #13: Setter injection – which to use depends on you &amp; api – prefer constructor – static languagesDepends also if dep is available at construction timeMaybe the setter can only used for testsConstruct objects with their dependencies
  • #14: Debugging, fixing bugs, pulling out hairAs a dev what is the least favorite part of your day? Debugging / documentationWhat is the hardest part of your day? DebuggingYUI / Javascript lets us be smarter / not have to change our function / constructor signatures
  • #15: Really really see it in YUI3 codeDeclare YUI3 deps &amp; instantiate themYUI ensure something called a, b, c loaded via mods file or already thereThe load step &amp; then tue ‘use’ stepWe just talked about this being a bad pattern – what can we do?
  • #16: What about injection???If we inject then our CALLING function needs to know all the deps for myObjectRequires statement now gone!Should we inject???? Is this really what we want?myObject no longer self-contained
  • #17: Now ready to test myObject!Just pushed deps up to script tags‘YUI3’ injectionIsolating objs using script tagsPre-load the mocks before the ‘real’ objects so YUI3 won’t get them
  • #18: If we inject then our CALLING function needs to know all the deps for myObjectRequires statement now gone!Declare deps and inject!You might be tempted to do this – hopefully you don’t need to!
  • #19: Does not have to be constructor injection!!This is better but still adds to our code – makes our code more modular however
  • #20: A better way – isolate mocks with loaderIf you mock all of your objectsShould mock every object when you make oneOR let YUI create script tags for you using modsUse advanced loader features to inject mocks instead of the ‘real’ thing using ‘filter’ http://randomgoo.blogspot.com/
  • #21: A better way – isolate mocks with loaderIf you mock all of your objectsShould mock every object when you make oneOR let YUI create script tags for you using modsUse advanced loader features to inject mocks instead of the ‘real’ thing using ‘filter’ http://randomgoo.blogspot.com/
  • #22: Debugging, fixing bugs, pulling out hairAs a dev what is the least favorite part of your day? Debugging / documentationWhat is the hardest part of your day? Debugging
  • #23: Mock object – NO DEPS!!Save as toolbar-mock.jsEVERY OBJECT SHOULD HAVE CORRESPONDING MOCK OBJECT!This is for testing DEPENDENCIES OF TOOLBAR NOT for testing toolbar itself!!
  • #24: However you get it on the page….A is a dependency of MyObjectConstructor injectedMocked DEP NOT OBJ!
  • #25: Debugging, fixing bugs, pulling out hairAs a dev what is the least favorite part of your day? Debugging / documentationWhat is the hardest part of your day? Debugging
  • #26: No literally hidden!ONLY test PUBLIC functionsUse the YUI augment or plugin or other way to mix in your private stuff info the object – then they can be tested in isolation
  • #27: ONLY TEST the PUBLIC parts of YOUR APIMENTION YUI PLUGIN AGGREGATION…Well not directlyInject them or minimize? They are a dependency black boxSince they are only used by your code – if you exercise your code you will exercise themPrivate functions are internal apiIf you got a lotta hairy ones refactor:
  • #28: Isolate ‘window’ object or make all in a single moduleInject window object or centralize itLets you test in env w/o ‘window or a ‘complete’ window objectKRAPLOAD of stuff in ‘window’!!Want to test that we’re callingwindow.escape with the right thing – maybe can tell from return value – maybe notEsp. stuff like local storage or xmlhttprequest or websockets
  • #29: Debugging, fixing bugs, pulling out hairAs a dev what is the least favorite part of your day? Debugging / documentationWhat is the hardest part of your day? Debugging
  • #30: Unit testing is testing functions in isolationBut dependencies – which everything has – can be pain pointsHow about zero dependencies???Ride JS to a conclutionYUI3 is a service locatorMORE smaller modules!! Use YUI ‘use’ &amp; composition to build them!
  • #31: Can’t test!
  • #32: Unit testing is testing functions in isolationBut dependencies – which everything has – can be pain pointsHow about zero dependencies???Ride JS to a conclutionYUI3 is a service locator
  • #33: All about dep managementIdentify deps &amp; deal with themDo not require/assume global variables – your module is a black boxAllow for headless tests
  • #34: Debugging, fixing bugs, pulling out hairAs a dev what is the least favorite part of your day? Debugging / documentationWhat is the hardest part of your day? DebuggingWorst part debugging your codeEven worser part debugging someone else’s code – don’t be that someone else!Make life easier and better for yourself and your co-workers by having tests in place – writing simple &amp; obvious code = testable code
  • #35: All about dep managementIdentify deps &amp; deal with themDo not require/assume global variables – your module is a black box