流星摩卡测试订阅
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 创建集合数据的模拟。
客户端不需要复杂的测试设置。
我目前正在使用 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 超时。
我已经查看了
任何人都可以针对此问题提出 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 创建集合数据的模拟。
客户端不需要复杂的测试设置。