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' を読み取れません

2 人のユーザーを作成するフィクスチャ ファイルは次のとおりです。

/* 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.logJasmine ログでフィクスチャの出力を確認でき、両方のユーザーが表示されます。undefinedchangeUserのテスト ログからのログと、完全なコレクション フェッチの現在のユーザーのみの配列。

私が想像できる他の唯一の問題は、出版と購読です。それらに問題はありませんが、見逃している可能性があります。ここに出版物があります:

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