Jest - одна из самых популярных тестовых сред, используемых в JavaScript. Написав тестовые примеры, вы можете быть уверены, что недавно добавленная функция не будет содержать ошибок и не повлияет на ваши существующие. Это делает ваше приложение более надежным, эффективным, а также гарантирует качество приложения. Использование сторонних сервисов и библиотек - обычная часть современных проектов. Код, написанный в вашем проекте, легко протестировать, потому что вы полностью контролируете его. Но контролировать поведение сторонних сервисов сложно и для решения этой проблемы мы имитируем сторонний сервис.

Кроме того, рекомендуется тестировать только свой код, а не код, импортированный из других мест. В идеале тестовые примеры, написанные поставщиком, должны охватывать эту часть. Мокинг просто позволяет вам заменить фактическую реализацию поддельным / фиксированным набором желаемого результата. Razorpay - один из популярных платежных шлюзов в Индии, который разработчик использует для онлайн-платежей.

Давайте посмотрим, как мы можем имитировать Razorpay API, чтобы протестировать наши API с помощью Jest.

Шаг 1: реализация API

Ниже приведен код, который показывает фактическую реализацию Razorpay API в index.js. Чтобы узнать больше об интеграции Razorpay с Node.js, прочтите здесь.

const Razorpay = require('razorpay')
const rzp = new Razorpay({
 key_id: "YOUR_KEY_ID",
 key_secret: "YOUR_KEY_SECRET",
})
router.post('/create_order', async (req, res) => {
 try {
  const rzpOrder = await rzp.orders.create({
   amount: amount * 100, // rzp format with paise
   currency: 'INR',
   receipt: "receipt#1" //Receipt no that corresponds to this Order,
   payment_capture: true,
   notes: {
    orderType: "Pre"
   } //Key-value pair used to store additional information
  })
  res.send(rzpOrder)
 } catch (err) {
  res.status(501).send(err.message)
 }
})

Шаг 2: насмешка API

Теперь давайте полностью смоделируем модуль Razorpay, вернув фиксированный набор выходных данных для каждой реализации Razorpay API.

jest.doMock('razorpay', () => {
 
return jest.fn(() => ({
  customers: {
   create: jest.fn(() => Promise.resolve({
    id: 'cust_123',
    name: "Jest_User",
    currency: "sgd",
    description: "Jest User Account created",
   })),
  },
  orders: {
   create: jest.fn(() => Promise.resolve({
    id: '7JS8SH'
   })),
   fetchPayments: jest.fn(() => Promise.resolve([{
    "entity":"collection",
    "count":1,   
    "items":[{
       "id":"pay_DaaSOvhgcOfzgR",
       "entity":"payment",
       "amount":2200,
       "currency":"INR"
    }]
   }])), 
  },
  subscriptions: {
   fetch: jest.fn(() => Promise.resolve({
    id: 'sub_00000000000001',
    "entity": "subscription",
    "plan_id": "plan_00000000000001",
   })),
   cancel: jest.fn(() => Promise.resolve({
    "id": "sub_00000000000001",
    "entity": "subscription",
   })),
  },
 }));
});

После имитации Razorpay давайте запишем тестовый пример в файл index.test.js и проверим API создания учетной записи.

const request = require('supertest')
const app = require('../../app')
const client = request(app)
const urlPrefix = '/'
let tokendescribe('Create order', () => {
 it('should create order', async () => {
  const res = await client.post(`${urlPrefix}/create_order`)
   .send({
     amount: "2200",
     currency: "inr",
     partial_payment: true,
    })
   expect(res.status).toEqual(200)
 })
})

Когда вы запустите указанный выше тестовый файл, вы получите идентификатор заказа как 7JS8SH вместо Фактический идентификатор заказа, потому что вы имитировали Razorpay API. Вы можете узнать больше о Razorpay и доступных функциях в официальной документации.

Спасибо за внимание. Если вам понравился пост, нажмите кнопку хлопка или оставьте комментарий.

Первоначально опубликовано на https://noob2geek.in 15 апреля 2021 года.

Больше контента на plainenglish.io