• Stars
    star
    2,291
  • Rank 20,097 (Top 0.4 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 11 years ago
  • Updated over 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Write better assertions

expect Travis npm package

Notice

This package has been donated to Jest. This means that all future development of expect v21+ will take place at facebook/jest.

You can use jest-codemods to automatically migrate your old tests using [email protected] to the new jest version of expect (>= 21)

Versions prior to v21 will receive limited support and bugfixes, and any future < v21 releases will be published on an npm tag that is not "latest", to avoid causing problems for v21+ users.

[email protected] documentation

expect lets you write better assertions.

When you use expect, you write assertions similarly to how you would say them, e.g. "I expect this value to be equal to 3" or "I expect this array to contain 3". When you write assertions in this way, you don't need to remember the order of actual and expected arguments to functions like assert.equal, which helps you write better tests.

You can think of expect as a more compact alternative to Chai or Sinon.JS, just without the pretty website. ;)

Installation

Using npm:

$ npm install --save expect

Then, use as you would anything else:

// using ES6 modules
import expect, { createSpy, spyOn, isSpy } from 'expect'

// using CommonJS modules
var expect = require('expect')
var createSpy = expect.createSpy
var spyOn = expect.spyOn
var isSpy = expect.isSpy

The UMD build is also available on unpkg:

<script src="https://unpkg.com/expect@%3C21/umd/expect.min.js"></script>

You can find the library on window.expect.

Assertions

toExist

expect(object).toExist([message])

Asserts the given object is truthy.

expect('something truthy').toExist()

Aliases:

  • toBeTruthy

toNotExist

expect(object).toNotExist([message])

Asserts the given object is falsy.

expect(null).toNotExist()

Aliases:

  • toBeFalsy

toBe

expect(object).toBe(value, [message])

Asserts that object is strictly equal to value using ===.

toNotBe

expect(object).toNotBe(value, [message])

Asserts that object is not strictly equal to value using ===.

toEqual

expect(object).toEqual(value, [message])

Asserts that the given object equals value using is-equal.

toNotEqual

expect(object).toNotEqual(value, [message])

Asserts that the given object is not equal to value using is-equal.

toThrow

expect(block).toThrow([error], [message])

Asserts that the given block throws an error. The error argument may be a constructor (to test using instanceof), or a string/RegExp to test against error.message.

expect(function () {
  throw new Error('boom!')
}).toThrow(/boom/)

toNotThrow

expect(block).toNotThrow([message])

Asserts that the given block does not throw.

toBeA(constructor)

expect(object).toBeA(constructor, [message])
expect(object).toBeAn(constructor, [message])

Asserts the given object is an instanceof constructor.

expect(new User).toBeA(User)
expect(new Asset).toBeAn(Asset)

Aliases:

  • toBeAn

toBeA(string)

expect(object).toBeA(string, [message])
expect(object).toBeAn(string, [message])

Asserts the typeof the given object is string.

expect(2).toBeA('number')

Aliases:

  • toBeAn

toNotBeA(constructor)

expect(object).toNotBeA(constructor, [message])
expect(object).toNotBeAn(constructor, [message])

Asserts the given object is not an instanceof constructor.

expect(new Asset).toNotBeA(User)
expect(new User).toNotBeAn(Asset)

Aliases:

  • toNotBeAn

toNotBeA(string)

expect(object).toNotBeA(string, [message])
expect(object).toNotBeAn(string, [message])

Asserts the typeof the given object is not string.

expect('a string').toNotBeA('number')
expect(2).toNotBeAn('object')

Aliases:

  • toNotBeAn

toMatch

expect(string).toMatch(pattern, [message])
expect(object).toMatch(pattern, [message])

Asserts the given string or object matches a pattern. When using a string, pattern must be a RegExp. When using an object, pattern may be anything acceptable to tmatch.

expect('a string').toMatch(/string/)
expect({
  statusCode: 200,
  headers: {
    server: 'nginx/1.6.5'
  }
}).toMatch({
  headers: {
    server: /nginx/
  }
})

toNotMatch

expect(string).toNotMatch(pattern, [message])
expect(object).toNotMatch(pattern, [message])

Asserts the given string or object does not match a pattern. When using a string, pattern must be a RegExp. When using an object, pattern may be anything acceptable to tmatch.

expect('a string').toMatch(/string/)
expect({
  statusCode: 200,
  headers: {
    server: 'nginx/1.6.5'
  }
}).toNotMatch({
  headers: {
    server: /apache/
  }
})

toBeLessThan

expect(number).toBeLessThan(value, [message])
expect(number).toBeFewerThan(value, [message])

Asserts the given number is less than value.

expect(2).toBeLessThan(3)

Aliases:

  • toBeFewerThan

toBeLessThanOrEqualTo

expect(number).toBeLessThanOrEqualTo(value, [message])

Asserts the given number is less than or equal to value.

expect(2).toBeLessThanOrEqualTo(3)

toBeGreaterThan

expect(number).toBeGreaterThan(value, [message])
expect(number).toBeMoreThan(value, [message])

Asserts the given number is greater than value.

expect(3).toBeGreaterThan(2)

Aliases:

  • toBeMoreThan

toBeGreaterThanOrEqualTo

expect(number).toBeGreaterThanOrEqualTo(value, [message])

Asserts the given number is greater than or equal to value.

expect(3).toBeGreaterThanOrEqualTo(2)

toInclude

expect(array).toInclude(value, [comparator], [message])
expect(object).toInclude(value, [comparator], [message])
expect(string).toInclude(value, [message])

Asserts that a given value is included (or "contained") within another. The actual value may be an array, object, or a string. The comparator function, if given, should compare two objects and return false if they are not equal. The default is to use isEqual.

expect([ 1, 2, 3 ]).toInclude(3)
expect({ a: 1, b: 2 }).toInclude({ b: 2 })
expect({ a: 1, b: 2, c: { d: 3 } }).toInclude({ b: 2, c: { d: 3 } })
expect('hello world').toInclude('world')

Aliases:

  • toContain

toExclude

expect(array).toExclude(value, [comparator], [message])
expect(object).toExclude(value, [comparator], [message])
expect(string).toExclude(value, [message])

Asserts that a given value is not included (or "contained") within another. The actual value may be an array, object, or a string. The comparator function, if given, should compare two objects and return false if they are not equal. The default is to use isEqual.

expect([ 1, 2, 3 ]).toExclude(4)
expect({ a: 1, b: 2 }).toExclude({ c: 2 })
expect({ a: 1, b: 2 }).toExclude({ b: 3 })
expect({ a: 1, b: 2, c: { d: 3 } }).toExclude({ c: { d: 4 } })
expect('hello world').toExclude('goodbye')

Aliases:

  • toNotContain
  • toNotInclude

toIncludeKey(s)

expect(object).toIncludeKeys(keys, [comparator], [message])
expect(object).toIncludeKey(key, [comparator], [message])

Asserts that the given object (may be an array, or a function, or anything with keys) contains all of the provided keys. The optional parameter comparator is a function which if given an object and a string key, it should return a boolean detailing whether or not the key exists in the object. By default, a shallow check with Object.prototype.hasOwnProperty is performed.

expect({ a: 1 }).toIncludeKey('a')
expect({ a: 1, b: 2 }).toIncludeKeys([ 'a', 'b' ])

Aliases:

  • toContainKey(s)

toExcludeKey(s)

expect(object).toExcludeKeys(keys, [comparator], [message])
expect(object).toExcludeKey(key, [comparator], [message])

Asserts that the given object (may be an array, or a function, or anything with keys) does not contain any of the provided keys. The optional parameter comparator is a function which if given an object and a string key, it should return a boolean detailing whether or not the key exists in the object. By default, a shallow check with Object.prototype.hasOwnProperty is performed.

expect({ a: 1 }).toExcludeKey('b')
expect({ a: 1, b: 2 }).toExcludeKeys([ 'c', 'd' ])

Aliases:

  • toNotContainKey(s)
  • toNotIncludeKey(s)

(spy) toHaveBeenCalled

expect(spy).toHaveBeenCalled([message])

Asserts the given spy function has been called at least once.

expect(spy).toHaveBeenCalled()

(spy) toNotHaveBeenCalled

expect(spy).toNotHaveBeenCalled([message])

Asserts the given spy function has not been called.

expect(spy).toNotHaveBeenCalled()

(spy) toHaveBeenCalledWith

expect(spy).toHaveBeenCalledWith(...args)

Asserts the given spy function has been called with the expected arguments.

expect(spy).toHaveBeenCalledWith('foo', 'bar')

Chaining Assertions

Every assertion returns an Expectation object, so you can chain assertions together.

expect(3.14)
  .toExist()
  .toBeLessThan(4)
  .toBeGreaterThan(3)

Spies

expect also includes the ability to create spy functions that can track the calls that are made to other functions and make various assertions based on the arguments and context that were used.

var video = {
  play: function () {},
  pause: function () {},
  rewind: function () {}
}

var spy = expect.spyOn(video, 'play')

video.play('some', 'args')

expect(spy.calls.length).toEqual(1)
expect(spy.calls[0].context).toBe(video)
expect(spy.calls[0].arguments).toEqual([ 'some', 'args' ])
expect(spy).toHaveBeenCalled()
expect(spy).toHaveBeenCalledWith('some', 'args')

spy.restore()
expect.restoreSpies()

createSpy

expect.createSpy([fn], [restore])

Creates a spy function with an (optional) implementation and (optional) restore logic. (In order for your provided implementation to be used, you must call andCallThrough.) For this reason, it's better to use andCall if you don't need custom restore logic.

var spy = expect.createSpy()

spyOn

expect.spyOn(target, method)

Replaces the method in target with a spy.

var video = {
  play: function () {}
}

var spy = expect.spyOn(video, 'play')
video.play()

spy.restore()

restoreSpies

expect.restoreSpies()

Restores all spies created with expect.spyOn(). This is the same as calling spy.restore() on all spies created.

// mocha.js example
beforeEach(function () {
  expect.spyOn(profile, 'load')
})

afterEach(function () {
  expect.restoreSpies()
})

it('works', function () {
  profile.load()
  expect(profile.load).toHaveBeenCalled()
})

Spy methods and properties

andCall

spy.andCall(fn)

Makes the spy invoke a function fn when called.

var dice = createSpy().andCall(function () {
  return (Math.random() * 6) | 0
})

andCallThrough

spy.andCallThrough()

Makes the spy call the original function it's spying on.

spyOn(profile, 'load').andCallThrough()

var getEmail = createSpy(function () {
  return "[email protected]"
}).andCallThrough()

andReturn

spy.andReturn(object)

Makes the spy return a value.

var dice = expect.createSpy().andReturn(3)

andThrow

spy.andThrow(error)

Makes the spy throw an error when called.

var failing = expect.createSpy()
  .andThrow(new Error('Not working'))

restore

spy.restore()

Restores a spy originally created with expect.spyOn().

reset

spy.reset()

Clears out all saved calls to the spy.

calls

spy.calls

An array of objects representing all saved calls to the spy.

You can use the length of the calls array to make assertions about how many times you expect the spy to have been called.

expect(spy.calls.length).toEqual(3)

You can also use the array to make assertions about each individual call. Each call object contains the following properties:

context

spy.calls[index].context

The this value of the call's execution context.

arguments

spy.calls[index].arguments

An array of the arguments passed to the spy for the particular call.

Extending expect

You can add your own assertions using expect.extend and expect.assert:

expect.extend({
  toBeAColor() {
    expect.assert(
      this.actual.match(/^#[a-fA-F0-9]{3,6}$/),
      'expected %s to be an HTML color',
      this.actual
    )
    return this
  }
})

expect('#ff00ff').toBeAColor()

Extensions

  • expect-element Adds assertions that are useful for DOM elements
  • expect-jsx Adds things like expect(ReactComponent).toEqualJSX(<TestComponent prop="yes" />)
  • expect-predicate Adds assertions based on arbitrary predicates
  • expect-enzyme Augments and extends expect to supercharge your enzyme assertions

More Repositories

1

unpkg

The CDN for everything on npm
JavaScript
2,989
star
2

mach

HTTP for JavaScript
JavaScript
812
star
3

http-client

Compose HTTP clients using JavaScript's fetch API
JavaScript
506
star
4

web-starter

Build and deploy a React website quickly on Heroku
JavaScript
417
star
5

citrus

Parsing Expressions for Ruby
Ruby
403
star
6

strata

A modular, streaming HTTP server for node.js
JavaScript
365
star
7

then-redis

A fast, promise-based Redis client for node.js
JavaScript
315
star
8

shadowbox

A beautiful, versatile lightbox for photos and videos
JavaScript
296
star
9

rollup-plugin-url-resolve

Use URLs in your Rollup imports
JavaScript
136
star
10

react-loop-2019

Notes and code examples from my React Loop 2019 Keynote
JavaScript
116
star
11

resolve-pathname

Resolve URL pathnames using JavaScript
JavaScript
63
star
12

expect-element

Write better assertions for DOM nodes
JavaScript
61
star
13

my-react

An experimental drop-in replacement for React without ES6 classes or "this"
JavaScript
58
star
14

dotfiles

My dotfiles
Vim Script
57
star
15

unpkg-demos

Experiments in how to use unpkg
HTML
54
star
16

history-server

An HTTP server for single-page apps that use the HTML5 history API
JavaScript
52
star
17

rack-accept

HTTP Accept* for Ruby/Rack
Ruby
46
star
18

mint

A small, fast documentation generator for literate-style programming
JavaScript
41
star
19

sinatra-session

Simple, secure sessions for Sinatra
Ruby
38
star
20

firework

A distributed, fault-tolerant work queue for Firebase
JavaScript
38
star
21

s3-thumb-server

Serve thumbnails of images stored on S3 over HTTP
JavaScript
35
star
22

ember-firebase

Firebase bindings for Ember.js
JavaScript
32
star
23

value-equal

Are these two JavaScript values equal?
JavaScript
31
star
24

monterey

Minimal OOP for JavaScript
JavaScript
31
star
25

optionparser

Command-line option parser for PHP
PHP
29
star
26

bufferedstream

A robust stream implementation for node.js and the browser
JavaScript
27
star
27

tree-shaking-react-router

Tree-shaking React Router with webpack 4
JavaScript
25
star
28

icare

A badge to promote empathy in software design, craftsmanship, and maintenance
HTML
25
star
29

react-style

Declarative styling for React components
JavaScript
21
star
30

remix-ssg-example

Small example of how to statically generate a Remix site using wget
TypeScript
19
star
31

dropbox-client

Dropbox API v2 client for JavaScript
JavaScript
17
star
32

bencode

Bencode library for PHP
PHP
15
star
33

reactjsday-2018

Demo + slides from my ReactJS Day 2018 keynote in Verona, Italy
JavaScript
14
star
34

symboltable

A Symbols-only Hash for Ruby
Ruby
13
star
35

broccoli-rev

A Broccoli plugin for adding revision checksums to file names
JavaScript
13
star
36

Fullscreen

A fullscreen sample app for Cocoa with MacRuby
Ruby
12
star
37

yuicompressor

A YUI JavaScript and CSS compressor wrapper for Ruby and JRuby
Ruby
12
star
38

react-router-examples

Code examples for React Router v6
TypeScript
12
star
39

usererror

A base class for JavaScript errors
JavaScript
12
star
40

plural

Pluralization library for PHP
PHP
12
star
41

grand

Generate random data in JavaScript
JavaScript
12
star
42

babel-plugin-import-visitor

Visit all import sources in Babel
JavaScript
10
star
43

then-couchdb

A promise-based CouchDB client for node.js
JavaScript
9
star
44

mwrc2012

Sample code from my talk at MWRC 2012
Ruby
8
star
45

multipart-web-stream

A streaming parser for multipart fetch streams
TypeScript
8
star
46

chatter

A little chat server for #CodeClass
JavaScript
6
star
47

markdown

Markdown as a Service
Ruby
5
star
48

http-client-cookie-jar

Cookie jar middleware for http-client
JavaScript
5
star
49

stratajs.org

The web site for the Strata web framework
JavaScript
5
star
50

form-data-parser

A request.formData() wrapper with pluggable file upload handling
TypeScript
5
star
51

maker

Small library for quickly constructing large segments of HTML in JavaScript
JavaScript
5
star
52

fetch-super-headers

A suite of tools that make it a little more fun to work with Headers
TypeScript
4
star
53

sinatra-spec

Simple specs for Sinatra apps using MiniTest
Ruby
3
star
54

broccoli-select

A Broccoli plugin for selecting files based on glob patterns
JavaScript
3
star
55

jview

A subclass of jQuery.fn for creating views in JavaScript
JavaScript
3
star
56

sequel-factory

Simple, powerful factories for Sequel models
Ruby
3
star
57

describe-property

Define JavaScript object properties quickly with ES5 defaults
JavaScript
3
star
58

mwrc2010

Rack For Web Developers - My presentation from MountainWest RubyConf 2010
Ruby
2
star
59

esbuild-node-builtins-sideeffects

JavaScript
2
star
60

rollup-watch-dir

JavaScript
2
star
61

html5-devconf-may2014

The slides and examples from my presentation at HTML5 DevConf on May 22, 2014
JavaScript
2
star
62

react-router-monorepo-stub

JavaScript
2
star
63

esbuild-empty-file-test

JavaScript
2
star
64

rollup-plugin-babel-bug

JavaScript
2
star
65

rubyconf2010

Grammars, Parsers, and Interpreters. In Ruby. ~ My presentation from RubyConf 2010
Ruby
2
star
66

lazy-file

Lazy, streaming files for JavaScript
TypeScript
2
star
67

jquery-pop

Painless views as models for jQuery
1
star
68

jdrag

Simple drag and drop for jQuery
JavaScript
1
star
69

redemption-from-callback-hell

JavaScript
1
star
70

mjackson.me

JavaScript
1
star
71

file-system

A simple filesystem for JavaScript, based on the File and Streams APIs
TypeScript
1
star
72

JavaScriptObjectsAndPatterns

Some code examples for a class I did for Twitter's HackWeek Q4 2012
JavaScript
1
star
73

mwrc2011

My presentation from MWRC 2011
1
star
74

hoedown2010

My presentation & code for the Ruby Hoedown 2010
1
star