node.js - 在集成测试中模拟不同的 Passport.js 策略

标签 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

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

最佳答案

从你的问题来看,我不清楚你到底想模拟什么函数。

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

要么你想模拟身份验证本身,例如依赖经过身份验证的用户来测试 API Controller 。对于这种情况,提供的链接是一种可能的方法。只需编写另一个身份验证机制来伪造登录用户即可。模拟策略不会像真实策略那样遍历所有代码,而只会执行最少需要完成的操作。如果需要的话,也许还可以操作数据库。如果您的问题不更具体,那么这里没有什么可添加的。

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

关于node.js - 在集成测试中模拟不同的 Passport.js 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36501655/

相关文章:

javascript - 水线,在数组中查找数组

node.js - 如何禁止通过 Express-session 存储的 session 的 TTL 刷新?

javascript - 使用 Application Insights NodeJ 进行遥测处理器内的异步操作

node.js - 使用预提交 Hook 更新 package.json 版本

unit-testing - 带有 Selenium 的 GWT 2.0

c# - 我可以复制 Moq Mock 实现吗?

javascript - sails.js:枚举的模型定义 - 值的动态列表

Android 单元测试运行所有类测试失败但每个方法都运行成功

node.js - 如何从mongodb中的对象数组中获取特定的数组元素

node.js - 如何在 Sails.js 上注册 Handlebars 部分外部文件夹?