chai-wait-for

Drop-in replacement for expect that waits for the assertion to succeed (retries on an interval you choose, until a timeout
you choose).
Provides an especially clean syntax for working with some chai plugins like chai-fs, chai-webdriverio-async etc:
await waitFor('#submittedMessage').to.have.text('Your changes have been saved!')
Usage
npm install --save-dev chai-wait-for
const chai = require('chai')
const chaiWaitFor = require('chai-wait-for')
const { afterEach } = require('mocha')
chai.use(chaiWaitFor)
const waitFor = chaiWaitFor.bindWaitFor({
chai,
timeout: 5000,
retryInterval: 100,
failOnDanglingCalls: afterEach,
})
it('wait for something', async function () {
this.timeout(10000)
const myObj = { foo: 0 }
setInterval(() => myObj.foo++, 1000)
await waitFor(myObj).to.have.property('foo').that.equals(3)
await waitFor(() => myObj.foo).to.equal(4)
await waitFor.timeout(1000)(myObj).to.have.property('foo').that.equals(3)
await waitFor.retryInterval(500)(myObj).to.have.property('foo').that.equals(3)
})
Plugin usage order/usage with chai-as-promised
All chai language chains that were defined before you use chai-wait-for will be available to use with it.
This is similar to chai-as-promsied, but although you generally need to chai.use(require('chai-as-promised')) after
all your other chai plugins, this is actually not the case for chai-wait-for, because chai-wait-for doesn't add or
overwrite any language chains.
Instead you should use chai-wait-for after chai-as-promised, so that you can waitFor .eventually assertions:
const chai = require('chai')
const chaiWaitFor = require('chai-wait-for')
chai.use(require('chai-as-promised'))
chai.use(chaiWaitFor)
const waitFor = chaiWaitFor.bindWaitFor({
chai,
retryInterval: 100,
timeout: 5000,
})
it('wait for something', async function () {
await waitFor(() => User.findOne({ where: { username: 'dude' } })).to
.eventually.not.exist
})