在 /config/passport.js
文件中,我定义并使用了不同的策略:
var
sails = require('sails'),
passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
CustomStrategy = require('passport-custom').Strategy,
GoogleStrategy = require('passport-google-oauth').OAuth2Strategy,
FacebookStrategy = require('passport-facebook').Strategy;
passport.use(new LocalStrategy({...}, function(email, password, done){...}));
passport.use('my-custom-strategy', new CustomStrategy(function (req, done){...}));
... same for FB and Google
我想做一个集成测试,我模拟从这些策略返回到 Controller 的结果(并专注于 Controller 的其余部分和服务处理)。具体来说,模拟 custom-strategy
对我来说很重要。
我可以找到一些稀有的例子,例如 this post和 followup link ,但无法与我的用例有太多联系。
任何人都可以给我一些代码示例,我可以从中开始构建测试吗?
var expect = require('chai').expect
, request = require('supertest')
, sinon = require('sinon')
, passport = require('passport');
describe('/auth', function () {
it('should return correct authentication response with tokens', function (done) {
// here I want to mock the custom strategy (or any other)
var requestBody = {
// some info
};
request(url)
.post('/auth')
.send(requestBody)
.end(function (err, res) {
if (err) {
return done(err);
}
console.log(res.body);
done();
});
});
});
最佳答案
从你的问题来看,我不清楚你到底想模拟什么函数。
我会在这里解释两个问题场景:
要么你想模拟身份验证本身,例如依赖经过身份验证的用户来测试 API Controller 。对于这种情况,提供的链接是一种可能的方法。只需编写另一个身份验证机制来伪造登录用户即可。模拟策略不会像真实策略那样遍历所有代码,而只会执行最少需要完成的操作。如果需要的话,也许还可以操作数据库。如果您的问题不更具体,那么这里没有什么可添加的。
另一种情况是您想要测试策略本身。所以你想模拟你的策略所依赖的外部 I/O。这可以是用户输入/http 流量和/或数据库交互。由于用户输入通常是使用 http 流量在服务器上收集的,并且许多策略使用外部服务器进行身份验证,因此我建议按照您需要的方式模拟实际的 http 流量来测试您的策略。您可以使用 nock 来执行此操作。对于数据库交互,您可以设置测试数据库。
关于node.js - 在集成测试中模拟不同的 Passport.js 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36501655/