Code Monkey home page Code Monkey logo

simulant's Introduction

simulant.js

Simulated DOM events for automated testing

What's this for?

Sometimes you need to create fake DOM events so that you can test the parts of your app or library that depend on user input. But doing so is a royal pain in the arse:

// WITHOUT SIMULANT.JS
try {
  // DOM Level 3
  event = new MouseEvent( 'mousemove', {
    bubbles: true,
    cancelable: true,
    relatedTarget: previousNode
  });

  node.dispatchEvent( event );
}

catch ( err ) {
  if ( document.createEvent ) {
    // DOM Level 2
    event = document.createEvent( 'MouseEvents' );
    event.initMouseEvent( 'mousemove', true, true, window, null, 0, 0, 0, 0, '', false, false, false, false, 0, previousNode );

    node.dispatchEvent( event );
  }

  else {
    // IE8 and below
    event = document.createEventObject();
    event.relatedTarget = previousNode;

    node.fireEvent( 'onmousemove', event );
  }
}


// WITH SIMULANT.JS
simulant.fire( node, 'mousemove', { relatedTarget: previousNode });

Simulant was created to make automated testing of Ractive.js across different browsers easier.

Why not just use jQuery?

In some cases you can. But events created with $(element).trigger('click'), for example, won't trigger handlers bound using element.addEventListener('click', handler) in many situations, such as when you're doing automated tests with PhantomJS.

Simulant uses native DOM events, not fake events, so its behaviour is more predictable.

Installation

npm install simulant

Usage

// Create a simulated event
event = simulant( 'click' );

// Create a simulated event with parameters, e.g. a middle-click
event = simulant( 'click', { button: 1, which: 2 });

// Fire a previously created event
target = document.getElementById( 'target' );
simulant.fire( target, event );

// Create an event and fire it immediately
simulant.fire( target, 'click' );
simulant.fire( target, 'click', { button: 1, which: 2 });

// Polyfill addEventListener in old browsers
if ( !window.addEventListener ) {
  simulant.polyfill();
}

Limitations

Normally, events have side-effects - a click in a text input will focus it, a mouseover of an element will trigger its hover state, and so on. When creating events programmatically, these side-effects don't happen - so your tests shouldn't expect them to. For example you shouldn't fire simulated keypress events at an input element and expect its value to change accordingly.

There are exceptions - a click event on a checkbox input will cause a secondary change event to be fired, for example.

Building and testing

Simulant uses jsdom for testing, which requires io.js rather than node.js.

To build the library, do npm run build.

To test the library using jsdom, do npm test.

To test the library in browsers, do npm start. This will build the library (and watch the source files for changes) and serve a simple test page to localhost:4567.

License

Copyright (c) 2013-15 Rich Harris (@rich_harris). Released under an MIT license.

simulant's People

Contributors

henrikjoreteg avatar levithomason avatar rich-harris avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.