在集成测试中模拟不同的 passport.js 策略

Posted

技术标签:

【中文标题】在集成测试中模拟不同的 passport.js 策略【英文标题】:Mocking different passport.js strategies in an integration test 【发布时间】:2016-07-29 20:07:28 【问题描述】:

在我定义的/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

我想做一个集成测试,在其中模拟从这些策略返回给控制器的结果(并专注于控制器的其余部分和服务处理)。具体来说,嘲笑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();
        );
    );
  );

【问题讨论】:

【参考方案1】:

从你的问题对我来说,不清楚你想模拟什么功能。

我会在这里解释两个问题场景:

要么你想模拟身份验证本身,f.e.测试依赖于经过身份验证的用户的 API 控制器。对于这种情况,提供的链接是一种可能的方式。只需编写另一个伪造登录用户的身份验证机制。模拟策略不会像真正的策略那样遍历所有代码,而只会做最少的需要做的事情。如果需要,也许还可以操作数据库。如果您的问题不是更具体,这里没有什么要补充的。

另一种情况是您想测试策略本身。因此,您想模拟您的策略所依赖的外部 i/o。这可以是用户输入/http 流量和/或数据库交互。由于用户输入通常是使用 http 流量在服务器上收集的,并且许多策略使用外部服务器进行身份验证,我建议按照您需要的方式模拟实际的 http 流量来测试您的策略。您可以使用nock 执行此操作。对于数据库交互,您可以 f.e.设置一个测试数据库。

【讨论】:

以上是关于在集成测试中模拟不同的 passport.js 策略的主要内容,如果未能解决你的问题,请参考以下文章

passport.js ,在弹出窗口中进行身份验证后,将其关闭并重定向父窗口

在不同情况下使用 Passport.js 更改和保存重定向

集成测试环境和集成测试应坚持的原则

使用 ProGuard,对测试策略有何影响?

如何正确使用 Passport.js?

[转]passport.js学习笔记