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

magical-mock

v0.9.1

Published

MagicalMock is a convenience class for simplify creation of mock objects and functions for testing purposes. This package is a port of the python unittest.mock, with additional features for JavaScript.

Downloads

3

Readme

MagicalMock

MagicalMock is a convenience class for simplify creation of mock objects and functions for testing purposes. This package is a port of the python unittest.mock, with additional features for JavaScript.

Install

npm i --save-dev magical-mock

Requirements

This library relies on heavily on ES6 Proxies, and so either a recent version of Node or the browsers will be required

Quick Examples


//given this hypothetical game function
function gameWorld(world) {
  if(world.player.meta.logged_in == true) {
    return world.greet(player);
  }else{
    return world.disconnect(player)
  }
}

it("Should let the logged in player see the greeeting", function() {
    //if you wanted to test this function you might do something like the following
    var world = {
      player: {
        meta: {
          logged_in: true
        },
        name: "Foo"
      },
      greet: function(player) {
        return "hello " + player.name;
      },
      disconnect: function(player) {
        throw Error("logged in player should not disconnect");
      }
    }
    expect(gameWorld(world)).to.equal("hello Foo");
});

//Now with mock we can do better with less code

it("Should let the logged in player see the greeeting", function() {
  let world = new Mock();
  world.player.meta.logged_in = true;
  gameWorld(world);
  world.greet.assert_called_once_with(world.player);
  world.disconnect.assert_not_called();

Magic

A mock object can generate properties when asked for. This makes targeting and replacing deeply nested properties within objects very quick.

    let mock = new Mock();
    mock.deeply.nested.prop = true
    mock.always.returns.a.new.mock = true
    mock.a.b.c.d.e.f.g.h = 10
    mock.lets.place.a.func = function() { return false};

Documentation

Properties

Methods

Properties

called

A boolean value which is set to true if the mock object is used as a function and called.

Examples

    let mock = new Mock();
    mock.called //false
    mock();
    mock.called //true

call_count

An integer count of the number of times the mock object has been called as a function.

Examples

    let mock = new Mock();
    mock();
    mock();
    mock.call_count; //2

call_args

A list of the arguments last used when calling the mock object as a function.

Examples

    let mock = new Mock();
    mock(1,2);
    mock.call_args; //[1,2]

call_args_list

A list of argument lists of the arguments used when calling the mock object as a function.

Examples

    let mock = new Mock();
    mock(1,2);
    mock(3,4);
    mock.call_args_list; //[[1,2], [3,4]]

return_value

Calling a mock object as a function by default returns another mock object. However, by assigning return_value to a value the mock will return that value instead.

Examples

    let mock = new Mock();
    mock.return_value = 4;
    mock() //4

side_effect

Side_effect allows the function to return successive values, throw errors, or substitute your own function for calling the mock as a function.

Examples

    let mock = new Mock();
    mock.side_effect = [1,2,Error("Problems occurred")];
    mock() //1
    mock() //2
    mock() //throw Error("Problems occurred")

    let mock2 = new Mock();
    mock2.side_effect = function(input) {
        if(input == 1) {
            return "foo";
        }else if(input == 2) {
            return "bar";
        }else{
            return "baz";
        }
    }
    mock2(1) //foo
    mock2(2) //bar
    mock2(3) //baz

    let mock3 = new Mock();
    mock3.side_effect = RangeError("Mock has gone too far");
    mock3() //throws RangeError

spec

Spec allows the mock to be assigned a prototype

Examples

    class Foo {};
    let mock = new Mock();
    mock.spec = Foo;
    mock instanceof Foo //true

constructs

If you would like to use a mock as a contructor function you can specify what it will create.

Examples

    let mock = Mock();
    mock.constructs = {x: 1, y: 2};
    let result = new mock(); //{x: 1, y: 2}

yields

If you would like to use a mock in a context as an iterator you can specify a value, or series of values, or an error to throw. If a generator function is provided instead then it will use that.

Examples

    let mock = new Mock();
    mock.yields = [1,2, Error("explosion")]
    for(let item of mock) {
        console.log(item);
    }
    //1
    //2
    //throws Error("foo")

    let mock2 = new Mock();
    mock2.yields = function* () { yield * [1,2] }
    for(let item of mock2) {
        console.log(item);
    }
    //1
    //2

Methods

assert_called_with(...args)

Asserts that the arguments were the last arguments used when calling the mock object as a function

Arguments

  • args - Variadic arguments matching the replaced function

Examples

    let mock = new Mock();
    mock(3,4);
    mock(1,2);
    mock.assert_called_with(1,2) //passes
    mock.assert_called_with(3,4) //throws Error

assert_called_once_with(...args)

Asserts that the mock was called once and only once with the specified arguments.

Arguments

  • args - Variadic arguments matching the replaced function

Examples

    let mock = new Mock();
    mock(1,2);
    mock.assert_called_once_with(1,2); //passes
    mock.assert_called_once_with(3,4); //throws Error because args do not match
    mock(3,4)
    mock.assert_called_once_with(3,4); //throws Error because mock was called more than once

assert_any_call(...args)

Asserts that the mock was called with specified arguments at least once.

Arguments

  • args - Variadic arguments matching the replaced function

Examples

    let mock = new Mock();
    mock(1,2);
    mock(3,4);
    mock.assert_any_call(1,2); //passes
    mock.assert_any_call(3,4); //passes
    mock.assert_any_call(4,5); //throws Error

assert_has_calls(calls, any_order=false);

Asserts that the mock was called with the specified list of argument lists, with the option to ensure the order of calls matched the list or to disregard order.

Arguments

  • calls - list of argument lists
  • any_order - boolean deciding if calls order should be respected

Examples

    let mock = new Mock();
    mock(1,2);
    mock(3,4);
    mock(4,5);
    mock.assert_has_calls([[3,4],[4,5]]) //passes
    mock.assert_has_calls([[1,2],[4,5]]) //throws Error
    mock.assert_has_calls([[1,2],[4,5]], true) //passes

assert_not_called()

Asserts that the mock was not called as a function.

Examples

    let mock = new Mock();
    mock.assert_not_called(); //passes
    mock(1,2);
    mock.assert_not_called(); //throws Error