之前曾问过类似的问题,我看着并遵循了这些问题,但没有运气:
我从这些中得到的一般答案是在之后,必须使用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 中加载) 之后,该方法已被模拟,因此我不确定为什么仍要调用原始方法。
我还尝试在模拟之前手动清除缓存,但仍然无法正常工作。
答案 0 :(得分:0)
我认为解决方案将使用Rewire代替(或与Supertest一起使用)。 通过Rewire,您可以模拟模块的顶级组件。尽管在传递给Supertest之前您需要模拟中间件。
答案 1 :(得分:0)
原来,这与让 supertest.js 需要 app.js 有关。现在,我有 users.spec.js 要求该应用程序,并将其作为参数传递给超级测试方法。现在可以使用了。仍然不确定为什么