Как использовать sinon для тестирования промежуточного программного обеспечения в nodejs? - PullRequest
0 голосов
/ 10 июля 2019

Пытаясь протестировать сценарий сбоя для промежуточного программного обеспечения, v1TransformResponse выдает ошибку при некоторой проверке, теперь в модульном тестировании я не могу получить ожидаемый результат, есть идеи, что реализовано неправильно в тесте ниже?я добавил ошибку, которую я получаю.

server.js

app.post('/cvs/v1/drugprice/:membershipId', orchestrateDrugPrice, v1TransformResponse);

v1TransformResponse.js

module.exports = async (req, res) => {
  try {
    const validateResponse = responseHandler(req.drugPriceResponse);
    const transformedResponse = transformResponse(validateResponse);
    const filterDrug = filteredResponse(transformedResponse);
    logDrugPriceResponse('TRANSFORMED_RESPONSE V1', filterDrug);

    res.status(200).send({ drugPrice: filterDrug });
  } catch (error) {
    if (error instanceof AppError) {
      res.status(error.response.status).send(error.response.payload);
    } else {
      res.status(500).send(defaultErrorResponse);
    }
  }
};

main.test.js

const { expect } = require('chai');
const sinon = require('sinon');
const { spy, stub } = require('sinon');
const request = require('supertest');
const app = require('./../../../server/server');
const v1TransformResponse = require('./../../../server/middleware/v1TransformResponse');
const orchestrateDrugPrice = require('./../../../server/middleware/orchestrateDrugPrice');

describe('v1Transform()', () => {
  let status,
    send,
    res;
  beforeEach(() => {
    status = stub();
    send = spy();
    res = { send, status };
    status.returns(res);
  });
  describe('if called with a request that doesn\'t have an example query', () => {
    const req = {
      drugPriceResponse: [{
        'brand': false,
        'drugName': 'Acitretin',
        'drugStrength': '10mg',
        'drugForm': 'Capsule',
        'retailPrice': {
          'copayEmployer': '0',
          'costAnnual': '3',
          'costEmployer': '733.84',
          'costToday': 'N/A',
          'daysSupply': '30',
          'deductible': 'n/a',
          'memberCopayAmount': '30',
          'NDC11': '378702093',
          'penalties': 'N/A',
          'totalDrugCost': '763.84'
        }
      }]
    };
    beforeEach(() => (req, res));
    it('should return error if prices are ommitted', async () => {
      try {
        await v1TransformResponse(req, res);
      } catch (error) {
        expect(error.response).to.deep.equal({
          httpStatus: 500,
          payload: {
            status: 500,
            title: 'Internal Server Error',
            detail: 'Drug prices are not valid'
          }
        });
      }
    });
  });
});

ОШИБКА:

  if called with a request that doesn't have an example query
         should return error if prices are ommitted:
     AssertionError: expected undefined to deeply equal { Object (httpStatus, payload) }

1 Ответ

1 голос
/ 10 июля 2019

Промежуточное программное обеспечение v1TransformResponse не выдает ошибки в случае сбоя.Он вызывает res.status метод.Вам нужно проверить переданный ему параметр.

it('should return error if prices are ommitted', async () => {
  await v1TransformResponse(req, res);
  expect(res.status.getCall[0].args[0]).to.equal(500);
});
...