Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法使用sinon模拟passport身份验证(';local';)方法_Javascript_Node.js_Unit Testing_Sinon_Sinon Chai - Fatal编程技术网

Javascript 无法使用sinon模拟passport身份验证(';local';)方法

Javascript 无法使用sinon模拟passport身份验证(';local';)方法,javascript,node.js,unit-testing,sinon,sinon-chai,Javascript,Node.js,Unit Testing,Sinon,Sinon Chai,我试图模仿护照。验证(“本地”): 我正在使用Sinon,但该方法不会在登录路由内执行console.log beforeEach(function (done) { aut = sinon.stub(server.passport, 'authenticate').returns(() => {}); server.app.on('appStarted', function () { done(); }); }); after

我试图模仿护照。验证(“本地”):

我正在使用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里面时。像这样验证(“本地”):

app.post('/login', () => {}, (req, res, next) => {console.log('should enter');})
aut = sinon.stub(server.passport, 'authenticate').returns((req, res, next) => next());
它仍然没有进入路由,这意味着sinoncallFake根本帮不上忙。只有当我移除

passport.authenticate('local')

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

在每次之前实施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()。因此,您应该按如下方式设置存根:

app.post('/login', () => {}, (req, res, next) => {console.log('should enter');})
aut = sinon.stub(server.passport, 'authenticate').returns((req, res, next) => next());

您的
aut
存根不是异步的吗?您想要
.yields
而不是
。returns
?不确定。。。如何将收益率应用于passport.authenticate?能否共享
app.js
?@eugensunic
sinon.stub(server.passport,'authenticate')
将替换
server.passport
对象上的
authenticate
属性,但是我仍然看不到server.passport从哪里来,以及它是否是用于模拟的正确对象。完整的代码在回购协议中可用吗?@eugensunic很高兴听到你的代码运行了。看来sinon存根根本没有任何作用。正如我在帖子中描述的那样。(req,res,next)=>next()是解决方案(只是在路由中实现了它),但我无法通过sinon实现它,任何想法。在我叫sinon的地方贴了更多的代码。。。