我正在为我的Meteor 1.4.2
应用程序编写单元测试,我的方法很少需要在处理之前进行身份验证。
我该如何测试这些方法?
到目前为止,我已经用practicalmeteor:mocha
编写了一个测试来创建一个新用户并使用该用户登录。
describe('login method', function () {
let logingKey;
beforeEach(function () {
Meteor.users.remove({});
const createUser = Meteor.server.method_handlers['registerUser'];
let params = {
username: 'testUsername'
}
res = createUser.apply({}, [params]);
logingKey = res.key;
});
it('can provide authentication', function () {
const loginUser = Meteor.server.method_handlers['login'];
let params = {
key: logingKey
}
console.log(params);
loginUser.apply({}, [params]);
});
我已经编写了一个自定义登录处理程序来使用生成的密钥登录,该密钥适用于应用程序,但在测试结果中我遇到了以下错误。
Error: Cannot read property 'id' of undefined
at AccountsServer.Ap._setLoginToken (packages/accounts-base/accounts_server.js:889:35)
at packages/accounts-base/accounts_server.js:288:10
at Object.Meteor._noYieldsAllowed (packages/meteor.js:671:12)
at AccountsServer.Ap._loginUser (packages/accounts-base/accounts_server.js:287:10)
at AccountsServer.Ap._attemptLogin (packages/accounts-base/accounts_server.js:349:12)
at Object.methods.login (packages/accounts-base/accounts_server.js:533:21)
at Object.methodMap.(anonymous function) (packages/meteorhacks_kadira.js:2731:30)
at Test.<anonymous> (imports/api/methods/loginUser.tests.js:30:17)
at run (packages/practicalmeteor:mocha-core/server.js:34:29)
at Context.wrappedFunction (packages/practicalmeteor:mocha-core/server.js:63:33)
这里有什么问题?欢迎任何建议,谢谢。
更新
确定!这是我的困惑,让我说我已经为这个方法写了一个单元测试,我应该如何在这里验证或获取userId。
Meteor.methods({
userStatus:function(update){
check(update, {online: String})
if (! this.userId) {
throw new Meteor.Error('error-not-authorized','User need to login', {method: "userStatus"})
}
try {
Meteor.users.update(Meteor.userId(),{$set: {'status.online': !!parseInt(update.online)}})
} catch (e) {
console.error("Error",e);
}
}
});
答案 0 :(得分:0)
您正在直接调用没有适当上下文的方法处理程序(应该是Method Invocation object,而您提供一个空对象)。 login
方法处理程序尝试获取连接ID,但未能这样做。
如果你想测试你的软件包与accounts-base
软件包的集成(基本上你正在调用它的一些代码),你可以创建一个连接并用该连接调用该方法。
let connection = DDP.connect(Meteor.absoluteUrl());
// prepare the login data
const params = {/*...*/};
connection.call('login', params);
// test post conditions
connection.disconnect();
修改(以下问题编辑):
答案基本保持不变。调用login
方法并登录用户后,服务器上的连接状态应包括登录用户的ID。现在,您可以调用需要用户登录的方法。
请注意,您应该在所有场合使用this.userId
(而不是Meteor.userId()
)。