我正在使用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