npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@tapjs/sinon

v3.0.0

Published

a sinon extension for tap

Downloads

4,164

Readme

@tapjs/sinon

A tap plugin for using sinon

A t.sinon property is added to tests, which is a Sinon sandbox for that single test. When the test is completed, the sandbox is torn down automatically, but you can also of course call t.sinon.restore() to remove all fakes and spies and such.

Also adds a sinon property to the test config, which can be used to configure the sinon property. If no config is specified, then it uses sinon.defaultConfig, which enables everything.

Installation

Install @tapjs/sinon, and add '@tapjs/sinon' to your plugin config list in package.json or .taprc.

# install the plugin:
npx tap plugin add @tapjs/sinon

# or, manually:
npm install --save-dev @tapjs/sinon

# add '@tapjs/sinon' to plugins list
vim .taprc

# rebuild tap with the plugin applied
npx tap plugin build

If you're using this, you may want to disable the built-in @tapjs/intercept plugin, because it has a very similar use case, but is much more limited in scope than sinon.

tap plugin rm @tapjs/intercept

Usage

Just use the t.sinon property, it's a sinon sandbox and it automatically cleans itself up when the test is done.

import t from 'tap'

const myAPI = { hello: () => {} }
t.test('some child test', t => {
  // this stub call is only relevant within this test
  t.sinon.stub(myAPI, 'hello')
  myAPI.hello()
  t.sinon.assert.calledOnce(myAPI.hello)
  t.end()
})

t.test('another test', async t => {
  // myAPI.hello is no longer a sinon stub
})

t.test(
  'sinon with a config object',
  {
    sinon: {
      injectInto: null,
      useFakeTimers: true,
    },
  },
  async t => {
    // t.sinon only has the configured setup here
  },
)

Using with Fake Timers

Sinon does not behave properly if fake timers are assigned to the same global object more than once, resulting in a 'Can't install fake timers twice on the same global object.' error.

By default, this library sets { useFakeTimers: false } in the options to avoid this. You can enable fake timers in a given test by setting it in the sinon option as shown in the examples above, but note that it can only be used in a single place in a test heirarchy.

For example:

// ok, works fine
t.test(
  'fake timers test one',
  { sinon: { useFakeTimers: true } },
  t => {
    t.test('child test', t => {
      // etc.
    })
  },
)
t.test(
  'second fake timers test',
  { sinon: { useFakeTimers: true } },
  t => {
    // etc.
  },
)

// this, however, does not work:
t.test('parent', { sinon: { useFakeTimers: true } }, t => {
  t.test('child', { sinon: { useFakeTimers: true } }, t => {
    // will throw an error
  })
})