wrapple
Dependency free wrapping function for browser natives to allow stubbing in unit tests.
Accessing natives through a thin wrapper makes stubbing possible, where it would otherwise be impossible.
You can use it with pretty much all globals defined on the window
object.
Link Seam
In Working Effectively with Legacy Code, Michael Feathers describes Seams. In the vernacular of that book, wrapple
would most likely be described as a Link Seam.
Compatibility
wrapple
should be able to run in most environments that can execute JavaScript
ES5.1 required
wrapple uses a couple of methods from ES5.1
If you need to support old browsers, you should ensure that these have been polyfilled.
Node.js supported
wrapple
can work in Node.js environments just like in browser environments.
Usage
Access browser natives through wrapple
Step 1
// use whatever local name you likevar wrap = ; // ensure that wrapple has wrapped the property you're interested in// this is idempotent, call it many times with no ill effects; // directly use the returned globalvar hostname = hostname;
Step 2
Now that your application code is using wrapped globals, you can target the wrapper function for stubbing, spying, etc.
var stub = sinon; // ...
Step 3
Tidy up your tests
// using sinonstub; // or using wrapple.resetwrap;
Methods
wrap
// wrap - adds a wrapped property method to the wrapple api// returns a function that returns window.location// also creates wrap.location method as target for stubbing; // add and use immediatelyvar hostname = hostname; // use via dedicated method;// ...var hostname = wraplocationhostname;
reset
// reset, removes all wrapper methods from wrapple apiwrap;
Unwrappable methods
These globals on the window
object are not wrappable, as creating the returning methods on wrapple
would interfere with the wrap
function.
constructor
isPrototypeOf
length
name
propertyIsEnumerable
toLocaleString
toString
That shouldn't be too much of a problem, as they seem unlikely targets for stubbing.
Links
License
MIT: http://mrgnrdrck.mit-license.org
wrapple.jp
In no way affiliated with, but admiring wrapple.jp