javascript - 无法使用 sinon 模拟护照验证 ('local' ) 方法

标签 javascript node.js unit-testing sinon sinon-chai

我试图模拟 Passport.authenticate('local'):

 app.post('/login', passport.authenticate('local'), (req, res, next) => {console.log('should enter');})

我使用的是Sinon,但该方法不执行登录路由内的console.log

beforeEach(function (done) {
      aut = sinon.stub(server.passport, 'authenticate').returns(() => {});
      server.app.on('appStarted', function () {
        done();
      });
    });

afterEach(() => {
  aut.restore();
});

describe('Login', () => {
  it('should login', (done) => {
    chai.request(server.app)
      .post('/login')
      .send({
        username: 'user',
        password: 'pas'
      })
      .end(function (error, response, body) {
        return done();
      });
  });
});

此外, 当我将模拟放入真正的passport.authenticate('local')中时,如下所示:

app.post('/login', () => {}, (req, res, next) => {console.log('should enter');})

它仍然没有进入路由,这意味着 sinon callFake 根本没有帮助。仅当我删除

passport.authenticate('local')

“应该登录”测试将从/login路由进入该路由。

在beforeEach中实现sinon

let server = require('../../../app.js');
let expect = chai.expect;
chai.use(chaiHttp);

var aut;
beforeEach(() => {
  aut = sinon.stub(server.passport, 'authenticate').returns((req, res, next) => next());
});

app.js

const app = express();

middleware.initMiddleware(app, passport);

const dbName = 'dbname';
const connectionString = 'connect string';

mongo.mongoConnect(connectionString).then(() => {
        console.log('Database connection successful');
        app.listen(5000, () => console.log('Server started on port 5000'));
    })
    .catch(err => {
        console.error('App starting error:', err.stack);
        process.exit(1);
    });

// If the Node process ends, close the Mongoose connection
process.on('SIGINT', mongo.mongoDisconnect).on('SIGTERM', mongo.mongoDisconnect);

register.initnulth(app);

login.initfirst(app, passport);
logout.initsecond(app);


module.exports = app;

最佳答案

您似乎想使用一个不执行任何操作的中间件回调,只是让请求由后面的中间件处理。这样的回调将是:

(req, res, next) => next()

中间件必须调用next()以使请求继续由后续中间件处理。所以你应该像这样设置你的 stub :

aut = sinon.stub(server.passport, 'authenticate').returns((req, res, next) => next());

关于javascript - 无法使用 sinon 模拟护照验证 ('local' ) 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54482911/

相关文章:

javascript - 使用 jquery 检测元素的 'scrollIntoView' 调用

javascript - onChange 将动态选择返回 null

node.js - 保护 node-webkit 桌面应用程序中的源代码

ruby-on-rails - 使用 RSpec 和 FactoryGirl 测试模型中的 Rails 类方法的正确方法是什么?

c++ - 有没有办法在运行特定测试后停止 GoogleTest,无论它通过还是失败?

java - 模拟对象并将它们分配给方法中的实例变量和静态变量

javascript - 如何用 javascript 解析以下 soap 响应? (不能使用 jquery)

javascript - 表单验证插件因类而失败

javascript - Node.js 垃圾收集和同步对象

javascript - 点对点 Javascript 等