【问题标题】:Unit tests on methods/publication that requires authentication in meteor需要在流星中进行身份验证的方法/出版物的单元测试
【发布时间】:2016-12-27 07:31:19
【问题描述】:

我正在为我的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)

这里可能有什么问题?欢迎任何建议,在此先感谢。

Original post on meteor forum

更新

好的!这是我的困惑,假设我为此方法编写了一个单元测试,我应该如何验证或获取 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);
      }
  }
});

【问题讨论】:

    标签: unit-testing meteor mocha.js


    【解决方案1】:

    您在没有适当上下文的情况下直接调用方法处理程序(应该是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())。

    【讨论】:

    • 你的意思是,我无法对需要登录用户的方法运行单元测试。
    • 我的意思是,你不能在没有调用对象的情况下调用依赖于调用对象的方法处理程序。模拟一个(包括连接)或使用演示的临时连接。
    • 我已经更新了问题,在这种情况下我应该如何编写单元测试,我的问题是
    • 我更新了答案。附带说明一下,首先尝试提供问题的实际详细信息,因为它们几乎是两个独立的问题(并且该站点旨在帮助特定问题,因此对测试中的方法调用有疑问的用户可以使用“第一个”答案,而在需要登录用户时对测试有疑问的用户可以使用“第二个”答案,这可能会更好地作为 2 个不同的问题)。
    • 感谢您指出,我对这些方法感到困惑,所以最初我尝试登录,之后我尝试在其他方法测试中调用相同的方法。我会记住这一点,以便提出单独的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2013-12-29
    • 2018-02-14
    相关资源
    最近更新 更多