我在我的应用测试中遇到了经过验证的方法包的问题。我通过_execute函数调用我的方法,以便能够在测试时传递userId来模拟登录用户。问题是在方法有机会完成之前调用了_execute下面的断言。我知道我的测试工作正常,因为它有时只会发生,主要是因为mongo并不总能以相同的速度返回结果。
我环顾四周,发现todos app在其测试中使用了_execute函数。不过,无论我重新运行多少次,我都无法让这些测试失败。
这是我的测试代码的一个例子。
describe('clients.add', function() {
it('should add an empty (draft) client', function() {
const res = clients_add._execute({ userId: 'CURRENTUSERID' }, { company_id: c1._id });
assert.instanceOf(res, Mongo.ObjectID, 'method returns the newly created clients ID');
const db_client = Clients.findOne(res);
assert.isTrue(db_client.draft, 'client is drafted');
assert.isDefined(db_client.created, 'there\'s a created date');
});
});
clients_add
做了不少权限检查,可以在完成之前花一点时间。重复该测试20次将失败约5次并通过另外15次。
_execute函数是否应该同步?我怎么做到的?我错过了什么?
答案 0 :(得分:0)
在服务器代码中,如果您提供对insert
等数据库修改函数的回调,它会立即返回创建的ID,并且只有在数据库确认写入后才运行回调。如果您不提供回调,则insert
调用是同步的,如果操作失败则会引发错误。详细了解此in Meteor docs。
您似乎已在方法代码中为insert
- 函数提供了错误处理回调。这会导致不一致的行为,因为在您在测试中调用findOne
之前,数据库可能实际上没有时间进行写入。此外,这是多余的,因为如果插入中发生错误,该方法已经返回并且错误永远不会显示给用户。最好简单地省略错误处理回调:
return Clients.insert(new_client);