Skip to content

Commit f2683d9

Browse files
gnapseKent C. Dodds
authored and
Kent C. Dodds
committedApr 10, 2018
feat: custom jest matchers from jest-dom (#15)
* Use custom jest matchers from jest-dom * Fix imports in tests
1 parent a49f959 commit f2683d9

8 files changed

+28
-278
lines changed
 

‎README.md

+23-95
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ your team down.
3838

3939
The `dom-testing-library` is a very light-weight solution for testing DOM nodes
4040
(whether simulated with [`JSDOM`](https://github.com/jsdom/jsdom) as provided by
41-
default with [jest](https://facebook.github.io/jest) or in the browser). The
42-
main utilities it provides involve querying the DOM for nodes in a way that's
43-
similar to how the user finds elements on the page. In this way, the library
44-
helps ensure your tests give you confidence in your UI code. The
45-
`dom-testing-library`'s primary guiding principle is:
41+
default with [jest][] or in the browser). The main utilities it provides involve
42+
querying the DOM for nodes in a way that's similar to how the user finds
43+
elements on the page. In this way, the library helps ensure your tests give you
44+
confidence in your UI code. The `dom-testing-library`'s primary guiding
45+
principle is:
4646

4747
> [The more your tests resemble the way your software is used, the more confidence they can give you.][guiding-principle]
4848
@@ -80,11 +80,7 @@ when a real user uses it.
8080
* [`waitForElement`](#waitforelement)
8181
* [`fireEvent(node: HTMLElement, event: Event)`](#fireeventnode-htmlelement-event-event)
8282
* [Custom Jest Matchers](#custom-jest-matchers)
83-
* [`toBeInTheDOM`](#tobeinthedom)
84-
* [`toHaveTextContent`](#tohavetextcontent)
85-
* [`toHaveAttribute`](#tohaveattribute)
86-
* [`toHaveClass`](#tohaveclass)
87-
* [Custom Jest Matchers - Typescript](#custom-jest-matchers---typescript)
83+
* [Using other assertion libraries](#using-other-assertion-libraries)
8884
* [`TextMatch`](#textmatch)
8985
* [`query` APIs](#query-apis)
9086
* [Debugging](#debugging)
@@ -400,106 +396,37 @@ fireEvent.click(getElementByText('Submit'), rightClick)
400396

401397
## Custom Jest Matchers
402398

403-
There are two simple API which extend the `expect` API of jest for making assertions easier.
404-
405-
### `toBeInTheDOM`
406-
407-
This allows you to assert whether an element present in the DOM or not.
399+
When using [jest][], we recommend that you import a set of custom matchers that
400+
make it easier to check several aspects of the state of a DOM element. These are
401+
provided by [jest-dom](https://github.com/gnapse/jest-dom), but are also
402+
included for convenience to be imported from this library directly:
408403

409404
```javascript
410-
// add the custom expect matchers
411405
import 'dom-testing-library/extend-expect'
412406
407+
// <span data-testid="greetings">Hello World</span>
408+
expect(queryByText(container, 'greetings')).toBeInTheDOM()
409+
expect(queryByText(container, 'greetings')).not.toHaveTextContent('Bye bye')
413410
// ...
414-
// <span data-testid="count-value">2</span>
415-
expect(queryByTestId(container, 'count-value')).toBeInTheDOM()
416-
expect(queryByTestId(container, 'count-value1')).not.toBeInTheDOM()
417-
// ...
418-
```
419411
420412
> Note: when using `toBeInTheDOM`, make sure you use a query function
421413
> (like `queryByTestId`) rather than a get function (like `getByTestId`).
422414
> Otherwise the `get*` function could throw an error before your assertion.
423-
424-
### `toHaveTextContent`
425-
426-
This API allows you to check whether the given element has a text content or not.
427-
428-
```javascript
429-
// add the custom expect matchers
430-
import 'dom-testing-library/extend-expect'
431-
432-
// ...
433-
// <span data-testid="count-value">2</span>
434-
expect(getByTestId(container, 'count-value')).toHaveTextContent('2')
435-
expect(getByTestId(container, 'count-value')).not.toHaveTextContent('21')
436-
// ...
437-
```
438-
439-
### `toHaveAttribute`
440-
441-
This allows you to check wether the given element has an attribute or not. You
442-
can also optionally check that the attribute has a specific expected value.
443-
444-
```javascript
445-
// add the custom expect matchers
446-
import 'dom-testing-library/extend-expect'
447-
448-
// ...
449-
// <button data-testid="ok-button" type="submit" disabled>
450-
// OK
451-
// </button>
452-
expect(getByTestId(container, 'ok-button')).toHaveAttribute('disabled')
453-
expect(getByTestId(container, 'ok-button')).toHaveAttribute('type', 'submit')
454-
expect(getByTestId(container, 'ok-button')).not.toHaveAttribute(
455-
'type',
456-
'button',
457-
)
458-
// ...
459415
```
460416

461-
### `toHaveClass`
417+
Check out [jest-dom's documentation](https://github.com/gnapse/jest-dom#readme)
418+
for a full list of available matchers.
462419

463-
This allows you to check wether the given element has certain classes within its
464-
`class` attribute.
420+
### Using other assertion libraries
465421

466-
```javascript
467-
// add the custom expect matchers
468-
import 'dom-testing-library/extend-expect'
422+
If you're not using jest, you may be able to find a similar set of custom
423+
assertions for your library of choice. Here's a list of alternatives to jest-dom
424+
for other popular assertion libraries:
469425

470-
// ...
471-
// <button data-testid="delete-button" class="btn extra btn-danger">
472-
// Delete item
473-
// </button>
474-
expect(getByTestId(container, 'delete-button')).toHaveClass('extra')
475-
expect(getByTestId(container, 'delete-button')).toHaveClass('btn-danger btn')
476-
expect(getByTestId(container, 'delete-button')).not.toHaveClass('btn-link')
477-
// ...
478-
```
479-
480-
### Custom Jest Matchers - Typescript
426+
* [chai-dom](https://github.com/nathanboktae/chai-dom)
481427

482-
When you use custom Jest Matchers with Typescript, you will need to extend the
483-
type signature of `jest.Matchers<void>`, then cast the result of `expect`
484-
accordingly. Here's a handy usage example:
485-
486-
```typescript
487-
import {getByTestId} from 'dom-testing-library'
488-
// this adds custom expect matchers
489-
import 'dom-testing-library/extend-expect'
490-
interface ExtendedMatchers extends jest.Matchers<void> {
491-
toHaveTextContent: (htmlElement: string) => object
492-
toBeInTheDOM: () => void
493-
}
494-
test('renders the tooltip as expected', async () => {
495-
// however you render it:
496-
// render(`<div><span data-testid="greeting">hello world</span></div>`)
497-
;(expect(
498-
container,
499-
getByTestId('greeting'),
500-
) as ExtendedMatchers).toHaveTextContent('hello world')
501-
})
502-
```
428+
If you're aware of some other alternatives, please [make a pull request][prs]
429+
and add it here!
503430

504431
## `TextMatch`
505432

@@ -768,3 +695,4 @@ MIT
768695
[set-immediate]: https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate
769696
[guiding-principle]: https://twitter.com/kentcdodds/status/977018512689455106
770697
[data-testid-blog-post]: https://blog.kentcdodds.com/making-your-ui-tests-resilient-to-change-d37a6ee37269
698+
[jest]: https://facebook.github.io/jest

‎extend-expect.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
// eslint-disable-next-line
2-
require('./dist/extend-expect')
2+
require('jest-dom/extend-expect')

‎package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
"extend-expect.js"
3535
],
3636
"dependencies": {
37-
"jest-matcher-utils": "^22.4.3",
37+
"jest-dom": "^1.0.0",
3838
"pretty-format": "^22.4.3",
3939
"mutationobserver-shim": "^0.3.2",
4040
"wait-for-expect": "^0.4.0"

‎src/__tests__/element-queries.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import '../extend-expect'
1+
import 'jest-dom/extend-expect'
22
import {render} from './helpers/test-utils'
33

44
test('query can return null', () => {

‎src/__tests__/example.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// query utilities:
22
import {getByLabelText, getByText, getByTestId, queryByTestId, wait} from '../'
33
// adds special assertions like toHaveTextContent
4-
import '../extend-expect'
4+
import 'jest-dom/extend-expect'
55

66
function getExampleDOM() {
77
// This is just a raw example of setting up some DOM

‎src/__tests__/wait-for-element.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {waitForElement, wait} from '../'
22
// adds special assertions like toBeInTheDOM
3-
import '../extend-expect'
3+
import 'jest-dom/extend-expect'
44
import {render} from './helpers/test-utils'
55

66
async function skipSomeTime(delayMs) {

‎src/extend-expect.js

-9
This file was deleted.

‎src/jest-extensions.js

-169
This file was deleted.

0 commit comments

Comments
 (0)