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-check: Property based testing using 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 jsdom.
- unexpected-exif: Assertions for EXIF data of images (node.js only).
- unexpected-events: Assertions for unit testing EventEmitters.
- unexpected-express: Express app/middleware assertions with a declarative syntax.
- 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-moment: Assertions for testing moment.js instances.
- unexpected-react: Assertions for React.js. Assert using JSX.
- unexpected-resemble: Image resemblance assertions based on resemble.js. Works in both node.js and the browser.
- unexpected-set: Add support for Set instances.
- unexpected-sinon: Add support for sinon spies.
- unexpected-stream: Assertions for node.js streams.
- unexpected-webdriver: Assertions for Selenium WebDriver.
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
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
in their package.json. This strategy is carefully thought out to be forward compatible
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
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 the
node_modulesfolder and run a fresh
- If you're stuck on a previous npm version, you should still try to remove
node_modulesand run a fresh
- 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.
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
Or you could assert that a node.js readable stream outputs an image that's at most 10% different from a reference image: