Code Monkey home page Code Monkey logo

react-remock's Introduction

 react-              /$$      /$$                     /$$      
                    | $$$    /$$$                    | $$      
  /$$$$$$   /$$$$$$ | $$$$  /$$$$  /$$$$$$   /$$$$$$$| $$   /$$
 /$$__  $$ /$$__  $$| $$ $$/$$ $$ /$$__  $$ /$$_____/| $$  /$$/
| $$  \__/| $$$$$$$$| $$  $$$| $$| $$  \ $$| $$      | $$$$$$/ 
| $$      | $$_____/| $$\  $ | $$| $$  | $$| $$      | $$_  $$ 
| $$      |  $$$$$$$| $$ \/  | $$|  $$$$$$/|  $$$$$$$| $$ \  $$
|__/       \_______/|__/     |__/ \______/  \_______/|__/  \__/

Build Status Greenkeeper badge npm downloads

FYI: You can mock any React Component, rendered anywhere, and for the any reason.

Requires external configuration to work with React18 / jsx-runtime

This is like proxyquire, or jest.mock. Not for node.js, but for React. Pure React Dependency Injection.

  • Every time you can NOT "storybook" something due to complexity.
  • Every time you can NOT "enzyme" something, cos something deeply inside is "too smart" (and you can't use shallow).
  • Every ^that^ time – mock the things you can NOT control.

Remock is based on the same technique, as React-Hot-Loader - intercepts React calls and do... whatever you want.

Use cases

This library was created for testing purposes only, while could be used to achive different tasks:

  • Using remock with enzyme testing allows you to perform more shallow mount testing. You can just mock out, complitely remove some (deep nested internal) Component which could make testing harder. For example - Redux Connect, always seeking proper Provider.

  • Using remock with storybooks testing allows you to hide some parts of "bigger", stories, leaving a holes in the story plot.

    • In case you are using BEM notation - it is really super easy to cat a hole, as long dimensions are propertly of a block, not element.
    • Yet again, in case of redux - you can replace connect by another component, to make it easier to provide mocked data for the story.
  • Remock created not only for testing, but (even more) for hacking into components, and making pretty things.

Featured in

API

Play in codesandbox - https://codesandbox.io/s/xk7vp60o4

API is simple - it gets React.createElement as an input and returns React.createElement as an output. And it will be called when real React.createElement has been called.

If you will not return anything - element willbe completely mocked. In other cases - you could specify what to return.

 import {remock} from 'react-remock';

 remock.mock('ComponentName'); // you can mock by name
 remock.mock(/Connect\((.*)\)/); // you can mock by RegExp
 
 remock.mock(ComponentClass); // you can mock by class
 
 remock.mock({ propName:42 }); // you can mock by component props
 
 remock.transparent(Component); // replaces Component by () => children. Makes it "transparent"
 
 remock.renderProp(Component, ...arguments); // "unwraps" renderProp component, by calling function-as-children with provided arguments 
 
 remock.match((type, props, children) => true); // you can mock using user-defined function
 
 remock.mock(Component, (type, props, children) => ({type?, props?, children?})); // you can alter rendering
 
 // unmock any mock `like` this
 remock.unmock('ComponentName' | ComponentName);
 
 const unmock = remock.mock(ComponentClass);
 // remove mock this mock only
 unmock();
 
 // and dont forget to
 remock.clearMock();

 // "scoped" mocks for local cleanups 
 remock.push();
 remock.mock('anything')
 remock.pop();

 
 
 // You can also use "declarative" React API. (only with mount!)
 // mocking has a global effect, `Remocking` would only automate cleanup
 mount(
   <div>
       <Remocking component="Red" />
       <Red />
   </div>
 );

PS: preact support it yet untested

Additional API

import {createElement, enable, disable} from 'react-remock';

createElement() // is a "real" React.createElement;

disable() ;// you can always disable rewiremock as a whole
enable(); // and enable it back

React 18

Out of the box Remock does not support React 18 to maintain backward compatibility. Currently, you have to patch jsx-runtime at the user side

// import jsx runtime
import jsxRuntime from "react/jsx-runtime";
import jsxRuntimeDev from "react/jsx-dev-runtime";

// import patch helper
import {patchJsxRuntime} from 'react-remock';

// apply the patch
patchJsxRuntime(jsxRuntime);
patchJsxRuntime(jsxRuntimeDev);

This may be fixed in the future versions

Dev/Production

The best way - not to use remock, and not require it in production.

If that is undoable - use "dev" exports, which will return mocked API for production builds.

import {remock} from 'remock/dev';

// you still can run all the commands
// but remock core does not exists.
remock.mock(...);

More examples

// change prop on Hello
remock.mock(Hello, () => ({props:{name:"Remock"}}))

// change h2 to h3, change style, change children
remock.mock('h2', (type, props, children) => { 
  return ({
  type: 'h4',
  props: {
    ...props,
    style: {color:'#700'},   
  },
  children: `πŸ§™οΈ ${children} πŸ› `
})})

// wrap divs with a border
remock.mock('div', (type, props) => ({
  props: {
    ...props,
    style:{
      ...props.style,
      border:'1px solid #000'
    },
  }
}));

Why you may need it?

See also

Remock is a little brother of rewiremock

Licence

MIT

Happy mocking!

react-remock's People

Contributors

greenkeeper[bot] avatar patrickshaw avatar thekashey avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

react-remock's Issues

Output from renderProp

Hello,

I'm wondering why there is a difference of the output from defaultMock and renderPropΒ in src/mocks.tsx. In defaultMock you get the props and itWas only contains the name of the original component. But in the case of renderProp the props are omitted and the whole component is put into itWas. I'm guessing there is some reason behind this (which I can't figure out) but this means that itWas will change when e.g. you change the propTypes or defaultProps of the component you are mocking. This becomes an issue when using snapshot testing because the snapshot of components using remock.renderProp will change even though there is no change in the actual component.

Let me know if I'm being unclear and you need an example :)

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.