gpt4 book ai didi

node.js - 在测试文件之外,Sinon stub 被忽略

转载 作者:太空宇宙 更新时间:2023-11-03 22:21:02 30 4
gpt4 key购买 nike

我正在使用 mocha、chai 和 sinon 来测试一些经过身份验证的 API 路由。我使用 Passport.authenticate() 作为中间件来验证路由:

const router = require('express').Router();
const passport = require('passport');

router.post('/route',
passport.authenticate('jwt', {session:false}),
function(req,res) {
return res.status(200);
});
module.exports = router;

然后,在我的测试套件中,我使用 sinon 来消除 Passport.authenticate 调用:

const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
const passport = require('passport');
const server = require('../../app');
const expect = chai.expect;

chai.use(chaiHttp);
describe('route', function() {
before(function(done) {
sinon.stub(passport, 'authenticate').callsFake(function(test, args) {
console.log('Auth stub');
});
console.log('stub registered');
passport.authenticate('jwt', {session:false});
done();
});
after(function(done) {
console.log('after hook');
passport.authenticate.restore();
done();
});
describe('POST /route', function() {
it('should post', function(done) {
console.log('starting test');
chai.request(server)
.post('/route')
.end(function(err,res) {
expect(res).to.have.status(200);
done();
});
});
});
});

现在,当我运行测试套件时,我看到它打印出以下内容:

  route
stub registered
Auth stub
POST /route
starting test
1) should post
after hook

1 failing

1) route
POST /route
should post:

Uncaught AssertionError: expected { Object (_events, _eventsCount, ...) } to have status code 200 but got 401

从中我们可以看到,注册 stub 后,我可以在测试文件中调用它,并且它已正确 stub 。但是当在route.post()中调用passport.authenticate()时,它是实际的passport.authenticate()并发送状态为401的响应,因为我没有经过身份验证。

对正在发生的事情有什么想法吗?

最佳答案

您的代码在运行后立即调用 passport.authenticate,并且在需要时立即运行

因为您在创建 stub 之前需要在测试开始时使用代码,所以您的代码最终会调用真正的passport.authenticate

为了让这样的代码调用 stub ,您必须在需要代码之前设置 stub :

const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
const passport = require('passport');
// const server = require('../../app'); <= don't require your code here...
const expect = chai.expect;

chai.use(chaiHttp);
describe('route', function () {
before(function (done) {
sinon.stub(passport, 'authenticate').callsFake(function (test, args) {
console.log('Auth stub');
});
console.log('stub registered');
passport.authenticate('jwt', { session: false });
done();
});
after(function (done) {
console.log('after hook');
passport.authenticate.restore();
done();
});
describe('POST /route', function () {
it('should post', function (done) {
console.log('starting test');
const server = require('../../app'); // <= require it AFTER creating the stub
chai.request(server)
.post('/route')
.end(function (err, res) {
expect(res).to.have.status(200);
done();
});
});
});
});

关于node.js - 在测试文件之外,Sinon stub 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55056593/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com