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

时间:2019-04-08 09:04:29

标签: javascript authentication meteor integration-testing

我正在使用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);
        }
    },
});

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

1 个答案:

答案 0 :(得分:0)

假设已经创建了用户,则可以使用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