Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added recipe for writing test with code depending on a window object #585

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions docs/recipes/browser-testing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Setting up AVA for browser testing

AVA does not support running tests in browsers [yet](https://github.com/sindresorhus/ava/issues/24).
Some libraries require browser specific globals (`window`, `document`, `navigator`, etc).
An example of this is React, at least if you want to use ReactDOM.render and simulate events with ReactTestUtils.

This recipe works for any library that needs a mocked browser environment.

## Install jsdom
Install [jsdom](https://github.com/tmpvar/jsdom).

> A JavaScript implementation of the WHATWG DOM and HTML standards, for use with node.js
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

node.js -> Node.js

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a quote from the jsdom repo description.


```
$ npm install --save-dev jsdom
```

## Setup jsdom
Create a helper file and place it in the `test/helpers` folder. This ensures AVA does not treat it as a test.

`test/helpers/setup-browser-env.js`:
```js
global.document = require('jsdom').jsdom('<body></body>');
global.window = document.defaultView;
global.navigator = window.navigator;

```
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

semicolons


## Configure tests to use jsdom

Configure AVA to `require` the helper before every test file.

`package.json`:
```json
{
"ava": {
"require": [
"./test/helpers/setup-browser-env.js"
]
}
}
```

## Enjoy

Write your tests and enjoy a mocked window object.

`test/my.react.test.js`:
```js
import test from 'ava';
import React from 'react';
import {render} from 'react-dom';
import {Simulate} from 'react-addons-test-utils';
import CustomInput from 'components/custom-input.jsx';
import sinon from 'sinon';

test('Input calls onBlur', t => {
const onUserBlur = sinon.spy();
const input = render(
React.createElement(CustomInput, {onUserBlur),
div,
)

Simulate.blur(input);

t.true(onUserBlur.calledOnce);
})
```
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

semicolons please