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

时间:2016-04-08 14:02:47

标签: node.js unit-testing sails.js integration-testing passport.js

在我定义的/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 postfollowup 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 个答案:

答案 0 :(得分:0)

从你的问题来看,我不清楚你想要模拟哪些函数。

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

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

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