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