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')
chai.use(chaiWaitFor)
const waitFor = chaiWaitFor.bindWaitFor({
timeout: 5000,
retryInterval: 100,
})
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({ retryInterval: 100, timeout: 5000 })
it('wait for something', async function () {
await waitFor(() => User.findOne({ where: { username: 'dude' } })).to
.eventually.not.exist
})