我正在使用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
答案 0 :(得分:1)
总结您当前的设置:
这是一个在这个范围内的大黑盒子。此外,您正在测试已经过Meteor核心团队测试的内容:服务器和客户端之间的方法和出版物的集成测试。
为防止浪费时间,您可以将设置拆分为两个测试:
如果这些测试使用正确的权限级别定义了预期的行为,您可以假设,如果您是具有订阅发布的正确权限级别的登录用户,则此用户将在您测试时获得结果行为在单位。正如我之前所指出的那样,pub / sub系统应该被定义为“工作”。
<强> 1。仅在服务器端测试方法
使用hwillson:stub-collections获取集合的“模拟”,使用practicalmeteor:sinon模拟Meteor.user()对象以测试不同的权限级别。
<强> 2。仅测试出版物,服务器端
使用johanbrook:publication-collector来测试您的出版物是否正常运行,并dburles:factory创建集合数据的模拟。
无需在客户端进行复杂的测试设置。