Получение только частичной публикации пользователя в тесте Meteor Jasmine

У меня есть тест интеграции клиента, чтобы убедиться, что мой пользователь-администратор может изменять роли пользователя через интерфейс управления пользователями в моем приложении. Однако, когда я запрашиваю пользователя, которого хочу изменить, запрос возвращается пустым, даже если он был создан в приборе.

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();
    });
});

Этот тест не проходит со следующей ошибкой:

Ошибка типа: невозможно прочитать свойство '_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 в журналах Жасмин, и это показывает обоих пользователей. Логи из тестовых логов undefined для changeUser и массива только текущего пользователя для полной выборки коллекции.

Единственные другие проблемы, которые я могу себе представить, - это публикация и подписка. Я не вижу в них ничего плохого, но я могу упустить это. Вот публикация:

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 по умолчанию, содержащая только текущего пользователя, но разве не стоит ждать на маршруте, а подписка пользователя на этом маршруте означает, что весь список пользователей публикуется / подписывается?

0 ответов

Другие вопросы по тегам