身份验证中间件未调用存根-NodeJS,Sinon

时间:2019-05-20 11:46:17

标签: javascript node.js unit-testing sinon

之前曾问过类似的问题,我看着并遵循了这些问题,但没有运气:

  1. Sinon stub being skipped as node express middleware
  2. node express es6 sinon stubbing middleware not working
  3. How to mock middleware in Express to skip authentication for unit test?

我从这些中得到的一般答案是之后,必须使用auth中间件方法模块(在我的情况下为app.js)。我已经做到了,但是仍然调用原始的中间件:

src / app.js

const authentication = require('./authentication')

...

app.use(['/api/users', '/api/groups'], authentication.ensureAuthenticed])

module.exports = app

src / authentication.js

const { isValidAuth } = require('./lib')

exports.ensureAuthenticated = (req, res, next) => {
    ...
}

__ helpers __ / supertest.js

// This file just calls endpoints with supertest but this is the only file
// that includes 'app'
const app = require('../../src/app')

module.exports = {
    post: {
        ...
    },
    get: {
        ...
    },
    put: {
        ...
    },
    delete: {
        ...
    }
}

users.spec.js

const authentication = require('../../src/authentication')
const authenticationStubs = require('../__stubs__/authentication')

let supertest
let ensureAuthStub

describe('Users', () => {
    before(() => {
        ensureAuthStub = sinon.stub(authentication, 'ensureAuthenticated').callsFake(authenticationStubs.ensureAuthenticated)
        supertest = require('../__helpers__/supertest')
    })

    // tests

    after(() => {
        ensureAuthStub.restore()
    })
})

__存根__ / authentication.js

exports.ensureAuthenticated = (req, res, next) => {
    ...
}

users.spec.js 中,我加载 supertest.js (在 src / app.js 中加载) 之后,该方法已被模拟,因此我不确定为什么仍要调用原始方法。

我还尝试在模拟之前手动清除缓存,但仍然无法正常工作。

2 个答案:

答案 0 :(得分:0)

我认为解决方案将使用Rewire代替(或与Supertest一起使用)。 通过Rewire,您可以模拟模块的顶级组件。尽管在传递给Supertest之前您需要模拟中间件。

答案 1 :(得分:0)

原来,这与让 supertest.js 需要 app.js 有关。现在,我有 users.spec.js 要求该应用程序,并将其作为参数传递给超级测试方法。现在可以使用了。仍然不确定为什么