摩卡测试不等待发布/订阅

时间:2015-04-30 12:01:20

标签: javascript testing meteor mocha velocity

堆栈

使用 Mocha + Velocity(0.5.3)进行Meteor客户端集成测试。我们假设我已经安装了 autopublish 包。

问题

如果从服务器插入MongoDB上的文档,客户端mocha测试将不会等待订阅同步,导致断言失败。

代码示例

服务器端Accounts.onCreateUser挂钩:

Accounts.onCreateUser(function (options, user) {
  Profiles.insert({
    'userId': user._id,
    'profileName': options.username
  });

  return user;
});

客户端摩卡测试:

beforeEach(function (done) {
  Accounts.createUser({
    'username'  : 'cucumber',
    'email'     : 'cucumber@cucumber.com',
    'password'  : 'cucumber' //encrypted automatically
  });

  Meteor.loginWithPassword('cucumber@cucumber.com', 'cucumber');
  Meteor.flush();
  done();
});

describe("Profile", function () {

  it("is created already when user sign up", function(){
    chai.assert.equal(Profiles.find({}).count(), 1);
  });

});

问题

如何让 Mocha 等待我的个人资料文档进入客户端,避免Mocha超时(从服务器创建)?

2 个答案:

答案 0 :(得分:5)

您可以反应等待文档。 Mocha有一个超时,因此如果没有创建文档,它会在一段时间后自动停止。

it("is created already when user signs up", function(done){
  Tracker.autorun(function (computation) {
    var doc = Profiles.findOne({userId: Meteor.userId()});
    if (doc) {
      computation.stop();
      chai.assert.propertyVal(doc, 'profileName', 'cucumber');
      done();
    }
  });
});

答案 1 :(得分:0)

Accounts.createUser有一个可选的回调,只需在此回调中调用done函数,如下所示:

beforeEach(function (done) {
    Accounts.createUser({
        'username'  : 'cucumber',
        'email'     : 'cucumber@cucumber.com',
        'password'  : 'cucumber' //encrypted automatically
    }, () => {
        // Automatically logs you in
        done();
    });
});
describe('Profile', function () {
    it('is created already when user sign up', function () {
        chai.assert.equal(Profiles.find({}).count(), 1);
    });
});