Coder Social home page Coder Social logo

robertcorey / cypress-autorecord Goto Github PK

View Code? Open in Web Editor NEW

This project forked from nanciee/cypress-autorecord

0.0 1.0 0.0 71 KB

Simplify API mocking by auto-recording/stubbing HTTP interactions and automating the process of updating/deleting mocks.

JavaScript 96.27% HTML 3.73%

cypress-autorecord's Introduction

Cypress Autorecord

Cypress Autorecord is a plugin built to be used with Cypress.io. It simplifies mocking by auto-recording/stubbing HTTP interactions and automating the process of updating/deleting recordings. Spend more time writing integration tests instead of managing your mock data. Refer to the changelog for more details on all the changes.

v2.0.0 is now live!

Version 2 is now compatible with Cypress 5 and 6 and includes a few enhancements. If you are upgrading from v1, your existing mock data will need to be re-recorded since the organization of the mocks has been updated. Take a look at this section to make the re-recording process as easy as possible.

If you are using an earlier cypress version, you will need to use cypress-autorecord v1.1.3

Getting Started

Install from npm

npm install --save-dev cypress-autorecord

Add this snippet in your project's /cypress/plugins/index.js

const fs = require('fs');
const autoRecord = require('cypress-autorecord/plugin');

module.exports = (on, config) => {
  autoRecord(on, config, fs);
};

To allow for auto-recording and stubbing to work, require cypress-autorecord in each of your test file and call the function at the beginning of your parent describe block.

const autoRecord = require('cypress-autorecord'); // Require the autorecord function
  
describe('Home Page', function() { // Do not use arrow functions
  autoRecord(); // Call the autoRecord function at the beginning of your describe block
  
  // Your hooks (beforeEach, afterEach, etc) goes here
  
  it('...', function() { // Do not use arrow functions
    // Your test goes here
  });
});

NOTE: Do not use ES6 arrow functions for your describe or it callback. This will cause the recording function to break.

That is it! Now, just run your tests and the auto-record will take care of the rest!

Updating Mocks

In the case you need to update your mocks for a particular test:

const autoRecord = require('cypress-autorecord');
  
describe('Home Page', function() {
  autoRecord();
  
  it('[r] my awesome test', function() { // Insert [r] at the beginning of your test name
    // ...
  });
});

This will force the test to record over your existent mocks for ONLY this test on your next run.

This can also be done through the configurations by adding the test name in the file cypress.json:

{
  "autorecord": {
    "recordTests": ["my awesome test"]
  }
}

Alternatively, you can update recordings for all tests by setting forceRecord to true before rerunning your tests:

{
  "autorecord": {
    "forceRecord": true
  }
}

Removing Stale Mocks

Stale mocks that are no longer being used can be automatically removed when you run your tests by setting cleanMocks to true in the file cypress.json:

{
  "autorecord": {
    "cleanMocks": true
  }
}

NOTE: Only mocks that are used during the run are considered "active". Make sure to only set cleanMocks to true when you are running ALL your tests. Remove any unintentional .only or .skip.

How It Works

How does the recording and stubbing work?

Cypress Autorecord uses Cypress' built-in cy.server to hook into every request, including GET, POST, DELETE and PUT. If mocks doesn't exist for a test, the http calls (requests and responses) are captured and automatically written to a local file. If mocks exist for a test, each http call will be stubbed by using cy.route in the beforeEach hook.

Where are the mocks saved?

The mocks will be automatically generated and saved in the /cypress/mocks/ folder. Mocks are grouped by test name and test file name. You will find mock files matching the name of your test files. Within your mock files, mocks are organized by test names in the order that they were called. Changing the test file name or test name will result to a disconnection to the mocks and trigger a recording on your next run.

Can I manually update the mocks?

Mocks are saved as a simple json object and can be updated manually. This is not recommended since any manual change you make will be overwritten when you automatically update the mocks. Leave the data management to cypress-autorecord. Make any modifications to the http calls inside your test so that it will be consistent across recordings.

it('should display an error message when send message fails', function() {
  cy.route({
    url: '/message',
    method: 'POST',
    status: 404,
    response: { error: 'It did not work' },
  });

  cy.get('[data-cy="msgInput"]').type('Hello World!');
  cy.get('[data-cy="msgSend"]').click();
  cy.get('[data-cy="errorMessage"]').should('contain', 'Looks like we ran into a problem. Please try again.');
});

Known Issues

Only XMLHttpRequests will be recorded and stubbed

Cypress-autorecord leverages Cypress' built in cy.route to handle stubbing, which means that it inherits some limitations as well. This is the disclaimer on the cy.route documentation page with some potential workarounds:

Please be aware that Cypress only currently supports intercepting XMLHttpRequests. Requests using the Fetch API and other types of network requests like page loads and <script> tags will not be intercepted or visible in the Command Log. See #95 for more details and temporary workarounds.

Contributions

I would really appreciate any help with bug fixes or any new features you think might be relevant! Feel free to submit a PR!

cypress-autorecord's People

Contributors

nanciee avatar fraserxu avatar mhssmnn avatar robertcorey avatar chauey avatar jrocketfingers avatar rangle-andrewlam avatar

Watchers

James Cloos 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.