我一直在使用 Jasmine 测试,特别是异步测试,我无法弄清楚它如何检测是否应该等待,如果您在测试中使用 done() 可能会超时。它工作得很好,我真的很好奇他们是怎么做到的。

让我们进行这个简单的测试。这两个显然有效(顺便说一句,即使没有 beforeEach()):

it('Sample test', function () {
    expect(true).toBe(true);
});

it('Sample test with done', function (done) {
    expect(true).toBe(true);
    done();
});

但是,如果我在第二次测试中不调用 done() ,它将超时。

在 JS 中,他们如何检查您传递给 it() 的函数是否声明了任何参数?

最佳答案

每个函数都有一个 .length 属性,它返回它具有的形式参数的数量:

console.log(function (a, b, c) { }.length);  // 3
console.log(function () { }.length);         // 0


看来这是 Jasmine 源中的相关位置:
for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) {
   var queueableFn = queueableFns[iterativeIndex];
   if (queueableFn.fn.length > 0) {
     attemptAsync(queueableFn);
     return;
   } else {
     attemptSync(queueableFn);
   }
 }

如果 .length 属性不为零,则将每个测试称为异步,如果为零则称为同步。

关于javascript - Jasmine 如何知道它是否应该等待 done()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28762943/

10-13 04:16