流星摩卡测试订阅

Meteor mocha test subscriptions

我目前正在使用 practicalmeteor:mocha 为我的应用程序编写客户端测试。因此,我需要在每个步骤之前将记录插入 mongo 集合。

根据流星的概念,我写了一些流星的方法来insert/update/delete记录。如果我想测试预期的行为,我假设我必须调用适当的方法 (例如插入一条记录) 然后必须等待订阅将记录同步到客户端,以便我可以验证插入。

我尝试了一些方法,但其中 none 似乎有效:

describe('a topic', function() {
    beforeEach(async function(done) {
        let res = await new Promise((resolve, reject) => {
            Meteor.call('topics.createNew', function(err, res) {
                if(err) return reject(err);
                resolve(res); //res is the _id from the generated record
            });
        });

        //subscribe to single record (the one just created)
        let subscription = Meteor.subscribe('topics.details', res); 

        //i assume this runs every time the publish function calls ready and therefor is also run when the new record is published
        Tracker.autorun((computation) => {
            let count = TopicsCollection.find({}).count();
            //console.log('topic count: ' + count);                

            if(subscription.ready() && count === 1) {
                computation.stop();
                done();
            }
        });
    });
});

我记录了计数的文档,当我将 autorun-Funktion 包装到 Promise 中时很幸运,但在这两种情况下都没有调用 done() 导致 mocha 超时。

我已经查看了 但我认为它对我的情况并没有真正帮助,因为我等待每一个可能的回调并且我正在使用一个普通的 Collection 并且上面问题中的人使用一个帐户包。

任何人都可以针对此问题提出 better/working 解决方案吗?
提前致谢! :D

总结您当前的设置:

  • 在客户端调用方法
  • 在服务器上插入一些文档
  • 从客户端订阅发布
  • 通过订阅的数据验证插入

这里是一个大黑匣子。此外,您正在测试 Meteor 核心团队已经测试过的东西:服务器和客户端之间方法和发布的集成测试。

为避免浪费时间,您可以将设置分成两个测试:

  • 作为一个单元测试 Meteor 方法
  • 作为一个单元测试 Meteor 出版物

如果这些测试定义了具有正确权限级别的预期行为,您可以假设,如果您是具有正确权限级别的登录用户订阅您的出版物,则该用户将获得与您一样的结果行为在单位测试过。正如我之前指出的,pub/sub 系统根据定义应假定为 'working'。

1.测试方法,仅服务器端

使用 hwillson:stub-collections to get a 'mock' of your collection, use practicalmeteor:sinon 模拟您的 Meteor.user() 对象以测试不同的权限级别。

2。测试发布,仅服务器端

使用 johanbrook:publication-collector to test if your publication is running correctly and dburles:factory 创建集合数据的模拟。

客户端不需要复杂的测试设置。