Заглушка Sinon не работает при использовании proxyquire - PullRequest
0 голосов
/ 11 марта 2020

Я пишу тесты для express API. Я использую тип зависимости от proxyquire до stub module.exports = someFunction().

У меня есть защищенный маршрут, поэтому я использовал proxyquire для заглушки auth промежуточного ПО.
Это auth промежуточное ПО будучи заглушенным.

В контроллере у меня есть модель, которая вычисляет строки из дБ. Я тоже хочу заглушить этот.
Так как этот метод привязан к модели UserAddress. Я могу напрямую заглушить его с помощью sinon.

, как показано ниже
let findUserAddressStub = sinon.stub(UserAdress, 'findAll').resolves({ adddre1: "address1", address2: "address2"})

Однако приведенный выше код не работает. findAll метод не заглушается.

Я думаю proxyquire связывается с scope из express app.

Я пытался заглушить его с proxyquire.
Но я не знаю Как заглушить отдельные методы при экспорте объектов?

modules.exports = {
findAll: function(){},
findOne: function(){}
}

address.test. js

const expect = require('chai').expect
const request = require('supertest')
const _ = require('lodash')
const sinon = require('sinon')
const proxyquire = require('proxyquire')
const {
    UserAddress
} = require('../../src/models')


describe('User Address /api/v1/user/addresses', function () {
    let authStub = sinon.stub().callsFake(function(req, res,next) {
        next()
    })
    authStub['@global'] = true
    const app = proxyquire('../../src/app', {
    './middlewares/auth': authStub
    });
    it('GET /api/v1/user/addresses', async () => {
        let findUserAddressStub = sinon.stub(UserAddress, 'findAll').resolves({
            id: "Z",
            address_line_1: null,
            address_line_2: null,
            city: null,
            state: "Bengaluru",
            pincode: null,
            is_deleted: false,
            landmark: null,
            map_lat: null,
            map_lng: null,
            label: null,
            service_area_id: null
        })
        const result = await request(app)
            .get('/api/v1/user/addresses')
            .set('Accept', 'application/json')
            .expect('Content-Type', /json/)
            .expect(200)
        expect(findUserAddressStub.calledOnce).to.be.true
        expect(result)
            .to.be.a('Object')
    })
})

Обновление
Я также попробовал код ниже. Но все равно он не работает.

 const app = proxyquire('../../src/app', {
    './middlewares/auth': authStub,
    './models/useraddress': {
        'findAll': findUserAddressStub
    }
    });

Адрес. js (контроллер)

//Models
const {
    UserAddress
} = require('../../models')

const getAddresses = async function(req, res, next) {
    const addresses = await UserAddress.findAll({
        where: {
            user_id: req.user.id,
            is_deleted: false
        },
        attributes: {
            exclude: ["user_id", "created_by", "updated_by", "created_on", "updated_on"]
        },
        ...paginate(+req.query.page, +req.query.per_page)
    })
    return res.status(200).send({
        status: true,
        message: "Successfully fetched addresses!",
        data: addresses
    })
}

Когда пользователь аутентифицирован, я вкладываю user_id в req внутри auth промежуточное программное обеспечение и передать его обработчику маршрута.

Итак, я попробовал ниже также

 let authStub = sinon.stub().callsFake(function(req, res,next) {
        req.user = {}
        req.user.id = 3
        next()
    })

Но, тем не менее, findUserAddressStub не вызывается.

1 Ответ

0 голосов
/ 11 марта 2020

Вот завершенный рабочий пример:

app.js:

const express = require('express');
const app = express();
const auth = require('./middlewares/auth');
const { UserAddress } = require('./models');

app.get('/api/v1/user/addresses', auth, async (req, res) => {
  const addrs = await UserAddress.findAll();
  res.json(addrs);
});

module.exports = app;

./middlewares/auth.js:

module.exports = function(req, res, next) {
  next();
};

./models/userAddress.js:

module.exports = {
  findAll: function() {},
  findOne: function() {},
};

./models/index.js:

module.exports = {
  UserAddress: require('./userAddress'),
};

address.test.js:

const expect = require('chai').expect;
const request = require('supertest');
const sinon = require('sinon');
const proxyquire = require('proxyquire');

describe('User Address /api/v1/user/addresses', function() {
  it('GET /api/v1/user/addresses', async () => {
    let authStub = sinon.stub().callsFake(function(req, res, next) {
      next();
    });
    authStub['@global'] = true;
    let findUserAddressStub = sinon.stub().resolves({
      id: 'Z',
      address_line_1: null,
      address_line_2: null,
      city: null,
      state: 'Bengaluru',
      pincode: null,
      is_deleted: false,
      landmark: null,
      map_lat: null,
      map_lng: null,
      label: null,
      service_area_id: null,
    });
    const app = proxyquire('./app', {
      './middlewares/auth': authStub,
      './models': {
        UserAddress: {
          findAll: findUserAddressStub,
        },
      },
    });
    const result = await request(app)
      .get('/api/v1/user/addresses')
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200);
    expect(findUserAddressStub.calledOnce).to.be.true;
    expect(result).to.be.a('Object');
  });
});

Результаты интеграционных испытаний с отчетом о покрытии:

  User Address /api/v1/user/addresses
    ✓ GET /api/v1/user/addresses (2824ms)


  1 passing (3s)

----------------------|---------|----------|---------|---------|-------------------
File                  | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------------------|---------|----------|---------|---------|-------------------
All files             |   91.67 |      100 |      25 |   91.67 |                   
 60631196             |     100 |      100 |     100 |     100 |                   
  app.js              |     100 |      100 |     100 |     100 |                   
 60631196/middlewares |      50 |      100 |       0 |      50 |                   
  auth.js             |      50 |      100 |       0 |      50 | 2                 
 60631196/models      |     100 |      100 |       0 |     100 |                   
  index.js            |     100 |      100 |     100 |     100 |                   
  userAddress.js      |     100 |      100 |       0 |     100 |                   
----------------------|---------|----------|---------|---------|-------------------

исходный код: https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/60631196

...