如何使用自定义登录处理程序在服务器上自动登录以进行 Meteor 集成测试



我正在使用Mocha和Chai为我的Meteor应用程序编写集成测试。这些测试仅适用于服务器功能。

我可以用 Sinon 伪造一个 Meteor 用户,但理想情况下,我想从真正登录用户开始。但是,我无法弄清楚如何在服务器上执行此操作。

我正在针对远程服务器进行身份验证;

服务器代码:

Accounts.registerLoginHandler((loginRequest) => {
    if ((remoteAuthenticate(loginRequest.username, loginRequest.password)) === true) {
        // remoteAuthenticate is a function that handles login against the remote server
        ...
        // handle login success and failure
    }
});

这是在客户端上调用的,如下所示:

Accounts.callLoginMethod({
    'methodArguments': [{
        'username': username,
        'password': password,
    }],
    'userCallback': function (err) {
        if (err) {
            Session.set('invalidCredentials', true);
        }
    },
});

从客户端登录工作正常,但我无法弄清楚如何在测试中直接在服务器上调用登录方法。流星或帐户方法似乎都没有这样做。感谢您的任何建议!

假设用户已创建,则可以使用DDP连接和名为 ongoworks:ddp-login 的包从远程进行身份验证。它旨在同时在服务器和客户端上运行。

首先将包添加到项目中:

meteor add ongoworks:ddp-login

然后在测试中创建连接并将其传递给登录调用:

const url = https://your.server.tld
const connection = DDP.connect(url);
// describe login
it('logs in to the remote if the user exists', function (done) {
  DDP.loginWithPassword(conn, {username: 'admin'}, 'admin', function (error) {
    if (error) {
      done(error)
    } else {
      done() 
    }
  })
})

connection实例的行为类似于您的Meteor全局实例,全局实例本身始终具有默认配置的默认连接。

例如:如果您需要使用登录用户从远程调用方法,则可以使用 connection 实例调用方法:

// describe method x
it('returns some value', function (done) {
  DDP.loginWithPassword(conn, {username: 'admin'}, 'admin', function (error) {
    // handle error...
    connection.call('method x', (err, res) => { /* handle err / res */ })
  })
})

资源:

https://atmospherejs.com/ongoworks/ddp-login

https://docs.meteor.com/api/connections.html#DDP-connect

最新更新