我在Express
中有以下内容02-02 11:35:01.140 17483-17483/com.example.tiger.servertest V/students: [Student One]
02-02 11:35:01.140 17483-17483/com.example.tiger.servertest V/students: [Student two, Student two]
我想覆盖或模拟isAuthenticated以返回此
//index.js
var service = require('./subscription.service');
var auth = require('../auth/auth.service');
var router = express.Router();
router.post('/sync', auth.isAuthenticated, service.synchronise);
module.exports = router;
这是我的单元测试:
auth.isAuthenticated = function(req, res, next) {
return next();
}
我尝试使用proxyquire模拟index.js - 我想我需要存根路由器? 我也试图在测试中覆盖
it('it should return a 200 response', function(done) {
//proxyquire here?
request(app).post('/subscriptions/sync')
.set('Authorization','Bearer '+ authToken)
.send({receipt: newSubscriptionReceipt })
.expect(200,done);
});
必须有一种简单的方法来模拟这一点,因此我不需要对请求进行身份验证。有什么想法吗?
答案 0 :(得分:21)
您可以使用sinon
存根isAuthenticated
方法,但是在将auth.isAuthenticated
的引用设置为中间件之前应该这样做,因此在您需要index.js
之前并创建app
。很可能你会想要beforeEach
钩子:
var app;
var auth;
beforeEach(function() {
auth = require('../wherever/auth/auth.service');
sinon.stub(auth, 'isAuthenticated')
.callsFake(function(req, res, next) {
return next();
});
// after you can create app:
app = require('../../wherever/index');
});
afterEach(function() {
// restore original method
auth.isAuthenticated.restore();
});
it('it should return a 200 response', function(done) {
request(app).post('/subscriptions/sync')
.set('Authorization','Bearer '+ authToken)
.send({receipt: newSubscriptionReceipt })
.expect(200,done);
});
请注意,即使在auth.isAuthenticated
恢复后,现有app
实例也会将存根作为中间件,因此如果您需要获取原始行为,则需要创建另一个app
实例出于某种原因。