流星摩卡测试订阅

时间:2018-01-30 10:52:19

标签: mongodb testing meteor mocha subscription

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

按照meteor的概念,我写了一些流星方法来插入/更新/删除记录。如果我想测试预期的行为,我假设我必须调用适当的方法(例如插入记录)然后必须等待订阅将记录同步到客户端,所以我可以验证插入。

我尝试了一些东西,但似乎没有一个能起作用:

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

我记录了计算好的文件,并且当我将自动运行Funktion包装到Promise中时运气不错,但在两种情况下都没有调用done()导致mocha超时。

我已经看过this question但是我觉得它在我的情况下并没有真正帮助,因为我等待所有可能的回调而且我正在处理一个普通的Collection并且上面问题中的人使用了一个帐户-package。

有人能为这个问题建议一个更好/更有效的解决方案吗? 提前致谢! :D

1 个答案:

答案 0 :(得分:1)

总结您当前的设置:

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

这是一个在这个范围内的大黑盒子。此外,您正在测试已经过Meteor核心团队测试的内容:服务器和客户端之间的方法和出版物的集成测试。

为防止浪费时间,您可以将设置拆分为两个测试:

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

如果这些测试使用正确的权限级别定义了预期的行为,您可以假设,如果您是具有订阅发布的正确权限级别的登录用户,则此用户将在您测试时获得结果行为在单位。正如我之前所指出的那样,pub / sub系统应该被定义为“工作”。

<强> 1。仅在服务器端测试方法

使用hwillson:stub-collections获取集合的“模拟”,使用practicalmeteor:sinon模拟Meteor.user()对象以测试不同的权限级别。

<强> 2。仅测试出版物,服务器端

使用johanbrook:publication-collector来测试您的出版物是否正常运行,并dburles:factory创建集合数据的模拟。

无需在客户端进行复杂的测试设置。