Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jcoreio/chai-wait-for
poll until an assertion succeeds
https://github.com/jcoreio/chai-wait-for
assertion async async-await await chai poll retry wait
Last synced: about 1 month ago
JSON representation
poll until an assertion succeeds
- Host: GitHub
- URL: https://github.com/jcoreio/chai-wait-for
- Owner: jcoreio
- License: mit
- Created: 2020-12-17T21:29:27.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2024-10-16T19:23:07.000Z (2 months ago)
- Last Synced: 2024-10-18T18:19:47.506Z (2 months ago)
- Topics: assertion, async, async-await, await, chai, poll, retry, wait
- Language: JavaScript
- Size: 818 KB
- Stars: 2
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# chai-wait-for
[![CircleCI](https://circleci.com/gh/jcoreio/chai-wait-for.svg?style=svg)](https://circleci.com/gh/jcoreio/chai-wait-for)
[![Coverage Status](https://codecov.io/gh/jcoreio/chai-wait-for/branch/master/graph/badge.svg)](https://codecov.io/gh/jcoreio/chai-wait-for)
[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)
[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)
[![npm version](https://badge.fury.io/js/chai-wait-for.svg)](https://badge.fury.io/js/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:
```js
await waitFor('#submittedMessage').to.have.text('Your changes have been saved!')
```# Usage
```sh
npm install --save-dev chai-wait-for
``````js
// First, use the plugin
const chai = require('chai')
const chaiWaitFor = require('chai-wait-for')
chai.use(chaiWaitFor)// Then create your `waitFor` with default options:
const waitFor = chaiWaitFor.bindWaitFor({
// If no assertion attempt succeeds before this time elapses (in milliseconds), the waitFor will fail.
timeout: 5000,
// If an assertion attempt fails, it will retry after this amount of time (in milliseconds)
retryInterval: 100,
})it('wait for something', async function () {
this.timeout(10000)const myObj = { foo: 0 }
setInterval(() => myObj.foo++, 1000)
// Then use it just like you would expect() (but note you must await it!)
await waitFor(myObj).to.have.property('foo').that.equals(3)// You can also use a getter function:
await waitFor(() => myObj.foo).to.equal(4)// If you need to override the defaults:
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:```js
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 () {
// User.findOne returns a promise; use .eventually.not.exist to wait for user to be deleted
await waitFor(() => User.findOne({ where: { username: 'dude' } })).to
.eventually.not.exist
})
```