Translations: Français
If you use ESLint, you can install eslint-plugin-ava. It will help you use AVA correctly and avoid some common pitfalls.
If you run AVA in Docker as part of your CI, you need to fix the appropriate environment variables. Specifically, adding -e CI=true
in the docker exec
command. See #751.
AVA uses is-ci to decide if it's in a CI environment or not using these variables.
You may be using a service that only allows a limited number of concurrent connections. For example, many database-as-a-service businesses offer a free plan with a limit on how many clients can be using it at the same time. AVA can hit those limits as it runs multiple processes, but well-written services should emit an error or throttle in those cases. If the one you're using doesn't, the tests will hang.
By default, AVA will use as many processes as there are logical cores on your machine. This is capped at two in a CI environment.
Use the concurrency
flag to limit the number of processes ran. For example, if your service plan allows 5 clients, you should run AVA with concurrency=5
or less.
You may be running an asynchronous operation inside a test and wondering why it's not finishing. If your asynchronous operation uses promises, you should return the promise:
test('fetches foo', t => {
return fetch().then(data => {
t.is(data, 'foo');
});
});
Better yet, use async
/ await
:
test('fetches foo', async t => {
const data = await fetch();
t.is(data, 'foo');
});
If you're using callbacks, use test.cb
:
test.cb('fetches foo', t => {
fetch((err, data) => {
t.is(data, 'foo');
t.end();
});
});
Alternatively, promisify the callback function using something like pify
:
test('fetches foo', async t => {
const data = await pify(fetch)();
t.is(data, 'foo');
});
AVA can't trace uncaught exceptions back to the test that triggered them. Callback-taking functions may lead to uncaught exceptions that can then be hard to debug. Consider promisifying and using async
/await
, as in the above example. This should allow AVA to catch the exception and attribute it to the correct test.
Ensure that the first parameter passed into your test is named t
. This is a requirement of power-assert
, the library that provides the enhanced messages.
test('one is one', t => {
t.assert(1 === 1);
});
Also make sure to enable Babel.
By default AVA executes tests concurrently. This can cause problems if your tests are asynchronous and share variables.
Take this contrived example:
const test = require('ava');
let count = 0;
const incr = async () => {
await true;
count = count + 1;
};
test.beforeEach('reset the count', () => {
count = 0;
});
test('increment once', async t => {
await incr();
t.is(count, 1);
});
test('increment twice', async t => {
await incr();
await incr();
t.is(count, 2);
});
Concurrent tests allow for asynchronous tests to execute more quickly, but if they rely on shared state you this may lead to unexpected test failures. If the shared state cannot be avoided, you can execute your tests serially:
const test = require('ava');
let count = 0;
const incr = async () => {
await true;
count = count + 1;
};
test.beforeEach('reset the count', () => {
count = 0;
});
test.serial('increment once', async t => {
await incr();
t.is(count, 1);
});
test.serial('increment twice', async t => {
await incr();
await incr();
t.is(count, 2);
});
Is your problem not listed here? Submit a pull request or comment on this issue.