Unit testing 对meteor中需要身份验证的方法/发布进行单元测试

Unit testing 对meteor中需要身份验证的方法/发布进行单元测试,unit-testing,meteor,mocha.js,Unit Testing,Meteor,Mocha.js,我正在为我的Meteor 1.4.2应用程序编写单元测试,在这个应用程序中,很少有方法需要在处理之前进行身份验证。 我应该如何测试这些方法 到目前为止,我已经用practicalmeter:mocha编写了一个测试来创建一个新用户并使用该用户登录 describe('login method', function () { let logingKey; beforeEach(function () { Meteor.users.remove({}); const createUser =

我正在为我的
Meteor 1.4.2
应用程序编写单元测试,在这个应用程序中,很少有方法需要在处理之前进行身份验证。 我应该如何测试这些方法

到目前为止,我已经用
practicalmeter: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)

您直接调用的方法处理程序没有适当的上下文(上下文应该是,而您提供的是空对象)。
login
方法处理程序尝试获取连接id,但未能获取

如果您想测试包与
accounts base
包的集成(基本上您是这样做的,因为您正在调用它的一些代码),您可以创建一个连接并使用该连接调用该方法

let connection=DDP.connect(Meteor.absoluteUrl());
//准备登录数据
常量参数={/*…*/};
connection.call('login',params);
//测试桩条件
连接断开();

编辑(以下问题编辑):

答案基本相同。调用
login
方法并登录用户后,服务器上的连接状态应包括登录用户的id。现在可以调用要求用户登录的方法


请注意,您可能在所有情况下都应该使用
this.userId
(而不是
Meteor.userId()
)。

您直接调用的是一个方法处理程序,没有适当的上下文(应该是一个,而您提供的是一个空对象)。
login
方法处理程序尝试获取连接id,但未能获取

如果您想测试包与
accounts base
包的集成(基本上您是这样做的,因为您正在调用它的一些代码),您可以创建一个连接并使用该连接调用该方法

let connection=DDP.connect(Meteor.absoluteUrl());
//准备登录数据
常量参数={/*…*/};
connection.call('login',params);
//测试桩条件
连接断开();

编辑(以下问题编辑):

答案基本相同。调用
login
方法并登录用户后,服务器上的连接状态应包括登录用户的id。现在可以调用要求用户登录的方法


请注意,您可能应该在所有情况下使用
this.userId
(而不是
Meteor.userId()
)。

您的意思是,我不能对需要登录用户的方法运行单元测试。我的意思是,您不能在没有调用对象的情况下调用依赖于调用对象的方法处理程序。要么模拟一个(包括一个连接),要么使用演示的临时连接。我更新了一个问题,在这种情况下,我应该如何编写单元测试,我的问题isI更新了答案。在旁注中,首先尝试提供问题的实际细节,因为这些问题几乎是两个独立的问题(本网站旨在帮助解决特定问题,因此,如果用户对测试中的方法调用有疑问,可以使用“第一个问题”)回答,如果用户有关于何时需要登录用户进行测试的问题,可以使用“第二个”答案,这可能会更好,因为有两个不同的问题)。感谢您指出,我对这些方法感到困惑,所以最初我尝试登录,之后我尝试在其他方法测试中调用相同的方法。我会记住这一点,以便单独提问。你的意思是,我不能对需要登录用户的方法运行单元测试。我的意思是,如果没有调用对象,你不能调用依赖于调用对象的方法处理程序。要么模拟一个(包括一个连接),要么使用演示的临时连接。我更新了一个问题,在这种情况下,我应该如何编写单元测试,我的问题isI更新了答案。在旁注中,首先尝试提供问题的实际细节,因为这些问题几乎是两个独立的问题(本网站旨在帮助解决特定问题,因此,如果用户对测试中的方法调用有疑问,可以使用“第一个问题”)回答,如果用户有关于何时需要登录用户进行测试的问题,可以使用“第二个”答案,这可能会更好,因为有两个不同的问题)。感谢您指出,我对这些方法感到困惑,所以最初我尝试登录,之后我尝试在其他方法测试中调用相同的方法。我会记住这一点,然后分别提问。
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);
      }
  }
});