首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用proxyquire时,Sinon存根不起作用

使用proxyquire时,Sinon存根不起作用
EN

Stack Overflow用户
提问于 2020-03-11 07:37:45
回答 1查看 1.3K关注 0票数 0

我正在为快速API编写测试。我使用proxyquirestub module.exports = someFunction()类型的依赖。

我有一个受保护的路由,所以我使用proxyquire来存根auth中间件。

这个auth中间件正在被删除。

在控制器中,我有一个模型,它考虑到db中的行。我也想把这封信存根。

因为这是一个附加到模型UserAddress的方法。我可以直接用sinon对它进行存根。

就像下面

let findUserAddressStub = sinon.stub(UserAdress, 'findAll').resolves({ adddre1: "address1", address2: "address2"})

但是,上面的代码不起作用。findAll方法没有被删除。

我认为proxyquire在和scope of express app闹着玩。

我试着用proxyquire本身对它进行存根。

但是,我不知道如何在导出对象时对单个方法进行存根。

代码语言:javascript
复制
modules.exports = {
findAll: function(){},
findOne: function(){}
}

address.test.js

代码语言:javascript
复制
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')
    })
})

更新

我也尝试了下面的代码。但还是没起作用。

代码语言:javascript
复制
 const app = proxyquire('../../src/app', {
    './middlewares/auth': authStub,
    './models/useraddress': {
        'findAll': findUserAddressStub
    }
    });

Address.js (控制器)

代码语言:javascript
复制
//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中间件中,并将其传递给路由处理程序。

所以我也试了下

代码语言:javascript
复制
 let authStub = sinon.stub().callsFake(function(req, res,next) {
        req.user = {}
        req.user.id = 3
        next()
    })

但是,findUserAddressStub并没有被调用。

EN

回答 1

Stack Overflow用户

发布于 2020-03-11 09:47:10

下面是一个完整的工作示例:

app.js

代码语言:javascript
复制
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

代码语言:javascript
复制
module.exports = function(req, res, next) {
  next();
};

./models/userAddress.js

代码语言:javascript
复制
module.exports = {
  findAll: function() {},
  findOne: function() {},
};

./models/index.js

代码语言:javascript
复制
module.exports = {
  UserAddress: require('./userAddress'),
};

address.test.js

代码语言:javascript
复制
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');
  });
});

集成测试结果与覆盖率报告:

代码语言:javascript
复制
  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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60631196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档