2

我有一个客户端集成测试,以确保我的管理员用户可以通过我的应用程序中的用户管理界面更改用户角色。但是,当我查询我想要更改的用户时,即使它是在夹具中创建的,查询也会返回为空。

describe('Admin users', function() {

    beforeEach(function(done) {
        Meteor.loginWithPassword('admin@gmail.com', '12345678', function(error) {
            Router.go('/users');
            Tracker.afterFlush(done);
        });
    });

    beforeEach(waitForRouter);

    afterEach(function(done) {
        Meteor.logout(function() {
            done();
        });
    });

    it('should be able to change user roles', function(done) {
        var changeUser = Meteor.users.findOne({ emails: { $elemMatch: { address: 'user@gmail.com' } } });
        console.log('changeUser: ', changeUser);
        console.log('Users: ', Meteor.users.find().fetch());
        $('#user-' + changeUser._id + '-roles').val('manage-users').change();
        expect(Roles.userIsInRole(changeUser, 'manage-users')).toBe(true);
        expect(Roles.userIsInRole(changeUser, 'edit-any')).toBe(false);
        done();
    });
});

此测试失败并出现以下错误:

TypeError:无法读取未定义的属性“_id”

这是创建两个用户的夹具文件:

/* globals
   resetDatabase: true,
   loadDefaultFixtures: true,
*/

var Future = Npm.require('fibers/future');

resetDatabase = function () {
  console.log('Resetting database');

  // safety check
  if (!process.env.IS_MIRROR) {
    console.error('velocityReset is not allowed outside of a mirror. Something has gone wrong.');
    return false;
  }

  var fut = new Future();

  var collectionsRemoved = 0;
  var db = Meteor.users.find()._mongo.db;
  db.collections(function (err, collections) {

    var appCollections = _.reject(collections, function (col) {
      return col.collectionName.indexOf('velocity') === 0 ||
        col.collectionName === 'system.indexes';
    });

    _.each(appCollections, function (appCollection) {
      appCollection.remove(function (e) {
        if (e) {
          console.error('Failed removing collection', e);
          fut.return('fail: ' + e);
        }
        collectionsRemoved++;
        console.log('Removed collection');
        if (appCollections.length === collectionsRemoved) {
          console.log('Finished resetting database');
          fut['return']('success');
        }
      });
    });

  });

  return fut.wait();
};

loadDefaultFixtures = function () {
  console.log('Loading default fixtures');
  var adminId = Accounts.createUser({email: 'admin@gmail.com', password: '12345678'});
  var standardUserId = Accounts.createUser({email: 'user@gmail.com', password: '12345678'});
  console.log('Users: ', Meteor.users.find().fetch());
  console.log('Finished loading default fixtures');
};

if (process.env.IS_MIRROR) {
  resetDatabase();
  loadDefaultFixtures();
}

console.log我可以在 Jasmine 日志中看到夹具的输出,它显示了两个用户。来自 changeUser 的测试日志undefined的日志和一个仅包含当前用户的数组,用于完整的集合提取。

我能想象的唯一其他问题是发布和订阅。我看不出他们有什么问题,但我可能会错过它。这是出版物:

Meteor.publish('allUsers', function () {
  if (Roles.userIsInRole(this.userId, ['manage-users'])) {
    return Meteor.users.find({}, { fields: { emails: true, roles: true, id: true}});
  } else {
    return this.ready();
  }
});

和订阅:

subscriptions: function() {
  return [Meteor.subscribe('allUsers'), Meteor.subscribe('allRoles')];
},

似乎只包含当前用户的默认 Meteor 用户发布正在交付以进行测试,但不应该等待路由并且该路由的用户订阅意味着整个用户列表正在发布/订阅?

4

0 回答 0