Plugins
Unexpected is designed to be highly extensible with new data types, assertions, output styles and themes.
Here's a partial list of plugins for Unexpected:
- unexpected-color: Assertions for strings representing colors.
- unexpected-couchdb: Run your tests against a mock CouchDB server initialized to a given state.
- unexpected-dom: Assertions for XML/HTML DOM and HTML/XML strings. Works in the browser and in node.js via
- unexpected-exif: Assertions for EXIF data of images (node.js only).
- unexpected-express: Express app/middleware assertions with a declarative syntax.
- unexpected-fs: Assertions for files and directories on disc, including mock file system support via mock-js.
- unexpected-http: Assertions for testing local or remote HTTP servers. Browser-compatible via browserify (experimental).
- unexpected-image: Assertions for image metadata (node.js only).
- unexpected-knockout: Add support for Knockout.js observables.
- unexpected-messy: Assertions for HTTP messages (requests and responses) and mails (rfc2822). Browser-compatible.
- unexpected-mitm: Mock out HTTP and make assertions about the HTTP traffic that goes on while executing other assertions. Based on the mitm module. Only works with node.js and io.js.
- unexpected-react-shallow: Assertions for the React.js shallow renderer. Assert using JSX.
- unexpected-resemble: Image resemblance assertions based on resemble.js. Works in both node.js and the browser.
- unexpected-sinon: Add support for sinon spies. jsdom.
- unexpected-stream: Assertions for node.js streams.
Installation
The recommended way to get plugins is installing them via npm:
And then in your test suite:
For plugins that work in the browser, you'll either need to add an extra <script>
, or
use browserify or a script loader instead of the Common.js require
in the above example.
Please consult the documentation for each individual plugin.
Caveats with plugins that depend on other plugins
The unexpected-express, unexpected-mitm, and unexpected-http plugins all depend on unexpected-messy being available. If you use more than one of these in the same test suite, it's important that only one version of unexpected-messy is installed.
All three plugins list unexpected-messy
under both peerDependencies
and dependencies
in their package.json. This strategy is carefully thought out to be forward compatible
with how peerDependencies
work with npm 3. Unfortunately, users of npm 1 and 2 will
sometimes be in for a bit of a rough ride.
Unexpected's use method will throw an error if you install two different
versions of unexpected-messy, so there's a stop gap that prevents expect
from
ending up in a broken state. Still, recovering from that error condition or an
EPEERINVALID
error can be tricky. We recommend trying the following:
- Upgrade to
npm 3
, then remove thenode_modules
folder and run a freshnpm install
. - If you're stuck on a previous npm version, you should still try to remove
node_modules
and run a freshnpm install
. - If that doesn't work, upgrade unexpected and the plugins you're using to the newest versions at once. The newest versions should be using the same version of unexpected-messy, which will resolve the problem in most cases.
Mixing plugins
All of these plugins should be able coexist in the same Unexpected instance and
compose well together. For instance, you can grab a few and assert that an express
app serves an HTML response body that contains a yellow <div>
:
Or you could assert that a node.js readable stream outputs an image that's at most 10% different from a reference image: