如何在 Parse 测试中设置经过身份验证的用户?

How set an authenticated user in Parse tests?

我已经为 Parse 配置了一些测试,但我不知道如何在 Parse.Cloud.run 中设置经过身份验证的用户:

it('set user authenticated', function(done) {
  var user = new Parse.User({username: 'example2', password: 'example'});
  user.save();
  Promise.resolve()
  .then(function() {
    return Parse.Cloud.run('thread', { user: { id: user.id } });
  })
});

所以在云函数中我有 request.user.id 并抛出 Undefined request.user

更多信息:https://github.com/ParsePlatform/parse-server/issues/2488

您在上面的代码中使用 promise 的方式有误:

user.save();
Promise.resolve()
   .then(function() {
     return Parse.Cloud.run('thread', { user: { id: user.id } });
   })

您不想使用 Promise.resolve().then()。你会想要 user.save().then()

下面是两组工作单元测试,我认为可以锻炼你想要的。

第一个将用户 ID 作为参数传递:

describe('pass parameters to cloud code', () => {
  // set up the cloud code function
  beforeEach(() => {
    Parse.Cloud.define('thread', (request, response) => {
      // just return the user id that passed in so we can test it.
      response.success(request.params.user.id);
    });
  });

  it('should pass parameters', (done) => {
    const user = new Parse.User({ 
      username: 'example2',
      password: 'example' 
    });

    user.save()
      .then(() => Parse.Cloud.run('thread', { user: { id: user.id } }))
      .then((result) => expect(result).toBe(user.id))
      .then(done)
      .catch(done.fail);
  });
});

第二组测试展示了如何将经过身份验证的用户传递给云代码。

describe('user in cloud code unit test', () => {
  beforeEach(() => {
    Parse.Cloud.define('thread', (request, response) => {
      const result = request.user
        ? request.user
        : 'no user set';
      response.success(result);
    });
  });

  it('should not have a user', (done) => {
    Parse.Cloud.run('thread')
      .then(result => expect(result).toBe('no user set'))
      .then(done)
      .catch(done.fail);
  });

  it('should get the logged in user', (done) => {
    Parse.User.signUp('Alice', 'Password', { name: 'value' })
      // note that we don't have to pass the logged in user
      // if there is a logged in user, it'll be in request.user           
      .then(() => Parse.Cloud.run('thread'))
      .then(userAsResult => expect(userAsResult.get('username', 'Alice')))
      .then(done)
      .catch(done.fail);
  });
});