I am writing a front end with React/JavaScript. I heard GraphQL and I do like it. I want to replace the REST API.
But I do not want to build the back end before I finish my front end, that mean I need a fake API. So there are two ways for me:
- Build a server that can deal with the request and return the fake response.
- Or we can... yes, mock those function.
IF YOU HAVE GOOD IDEA, FEEL FREE TO TELL ME PLEASE: peterlitszo at gmail, I WILL CHANGE/UPDATE IT SOON!
First Part - Build a server.
This post have a easy setup that build a fake server:
https://dev.to/ekafyi/serving-nothing-through-graphql-58cc
Apollo is a package to build a GraphQL client, here is the document to build mock server:
https://www.apollographql.com/docs/apollo-server/testing/mocking/
But I do not want to build this. The reason is easy: In computer the port can only hold by one process. That mean I need to hold two process (the first is the React development (with HMR) process, the second is the server process), and I need to change the variable by the environment (dev or release).
Second Part - Mock.
This is the way I am using. I am using msw now.
In the main javascript file, I add this part, so the msw will get the request in browser and then return the fake data, which defined in file ./src/mock/browser.js:
// ./src/index.jsx if (process.env.NODE_ENV === 'development') { const { worker } = await import('./mock/browser'); worker.start(); console.log('Add mock...'); } Now it is time to create file ./src/mock/browser.js:
// ./src/mock/browser.js import { setupWorker, graphql } from 'msw'; import { filter, isUndefined } from 'lodash'; import { faker } from '@faker-js/faker'; // The news' data. const new_data = { news: [ { id: 1, title: 'First', image_uri: faker.image.abstract(undefined, undefined, true), content: 'First '.repeat(1000), summary: 'A lot of word `First`', }, { id: 2, title: 'Second', image_uri: faker.image.abstract(undefined, undefined, true), content: 'Second '.repeat(1000), summary: 'A lot of word `Second`', }, { id: 3, title: 'White', image_uri: faker.image.abstract(undefined, undefined, true), content: 'White '.repeat(1000), summary: 'Just white', }, { id: 4, title: 'Random', image_uri: faker.image.abstract(undefined, undefined, true), content: faker.lorem.paragraphs(100, '\n\n'), // markdown summary: 'Hello', }, ], }; // Mock the query named News const News = graphql.query('News', (req, res, ctx) => { const { newsId } = req.variables; const news = isUndefined(newsId) ? news_data.news : filter(news_data.news, (new_) => parseInt(newsId) === new_.id); return res(ctx.data({ news })); }); // The log's data. const log_data = { users: [ { id: 1, name: 'Peter', emails: ['peterlitszo at gmail.com'], password: 'admin123', isAdmin: true, }, ], }; // Mock the query named Log. const Log = graphql.query('Log', (req, res, ctx) => { const { email } = req.variables; return res( ctx.data({ ...filter(log_data.users, (o) => o.emails.includes(email)), }), ); }); // build and export the worker. const handlers = [News, Log]; export const worker = setupWorker(...handlers);
Top comments (0)