Jasmine 如何知道它是否应该等待 done()?
How does Jasmine know if it should wait for done()?
我一直在使用 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
属性,returns它有的形式参数的数量:
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
属性 非零,则称每个测试为异步,如果为零,则称其为同步。
我一直在使用 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
属性,returns它有的形式参数的数量:
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
属性 非零,则称每个测试为异步,如果为零,则称其为同步。