2016-06-07 41 views
1

我想测试一个里面调用供应商中间件函数的中间件函数。中间件是:如何测试依赖其他供应商中间件的快递中间件?

const expressJwt = require('express-jwt'); 
const validateJwt = expressJwt({ secret: 'whatever' }); 

exports.isAuthenticated = (req, res, next) => { 
    if (req.query && req.query.hasOwnProperty('access_token')) { 
    req.headers.authorization = `Bearer ${req.query.access_token}`; 
    } 

    validateJwt(req, res, next); 
}; 

我试图创建一个sinon.spy()对象,并把它作为next参数,但显然不是叫。

另一种方法我试过是检查是否存在req.user,因为express-jwt中间件的目的是为了验证和连接userreq对象。没有这个运气。

我看过chai-connect的存在,但不知道如何使用它。

任何想法?高度欣赏它!

回答

0

我终于有proxyquirechai-connect做到这一点:

在你的摩卡配置:

chai.use(require('chai-connect-middleware')); 
global.connect = chai.connect; 

在您的测试:

describe('isAuthenticated',() => { 
// Wrap call to chai.connect into a function to use params and return a Promise 
const mockedMiddleware = (changeSecret) => { 
    let oldToken; 
    if (changeSecret) { 
    oldToken = acessToken; 
    acessToken = 'blabalblalba'; 
    } 

    return new Promise((resolve, reject) => { 
    connect.use(middleware.isAuthenticated) 
     .req(req => { 
     req.query = { access_token: acessToken }; 
     }) 
     .next((res) => { 
     acessToken = oldToken; 
     if (res && res.status === 401) { 
      reject(res.message); 
     } else { 
      resolve(); 
     } 
     }) 
     .dispatch(); 
    }); 
}; 

it('should validate correctly',() => 
    mockedMiddleware().should.be.fulfilled 
); 

it('should not validate',() => 
    mockedMiddleware(true).should.be.rejected 
); 
}); 
相关问题