使用 done() 在 Jasmine 2.0.0 中测试异步功能
Test asynchronous functionality in Jasmine 2.0.0 with done()
我正在尝试使用 done() 函数对简单的 promise 实现(异步代码)实施 jasmine 测试,但我的测试失败了,尽管被测试的代码工作得很好。
谁能帮我弄清楚我的测试中缺少什么?
var Test = (function () {
function Test(fn) {
this.tool = null;
fn(this.resolve.bind(this));
}
Test.prototype.then = function (cb) {
this.callback = cb;
};
Test.prototype.resolve = function (value) {
var me = this;
setTimeout(function () {
me.callback(value);
}, 5000);
};
return Test;
})();
describe("setTimeout", function () {
var test, newValue = false,
originalTimeout;
beforeEach(function (done) {
originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
test = new Test(function (cb) {
setTimeout(function () {
cb();
}, 5000);
});
test.then(function () {
newValue = true;
console.log(1, newValue);
done();
});
});
it("Should be true", function (done) {
expect(1).toBe(1);
expect(newValue).toBeTruthy();
});
afterEach(function () {
jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
});
});
jsfiddle 中的相同测试:http://jsfiddle.net/ravitb/zsachqpg/
此代码正在测试类似对象的简单承诺,因此为方便起见,将 Test
对象称为承诺。
promise 创建后有两个不同的异步事件:
1..then()
方法的调用
2.通过在beforeEach()
函数中调用cb()
函数来解析promise。
在现实世界中,这两个可以随时以任何顺序调用。
对于测试,必须将 .then()
调用移至 it()
部分的回调,并且需要在其回调中调用所有规范方法(例如 expect()
),否则它们' ll 运行 在解决之前。 beforeEach()
是测试设置的一部分,而 it()
函数是规范,即测试本身。
done()
方法需要调用两次,
当 beforeEach()
异步操作完成时(即在调用 cb()
之后),将开始 运行 规范。所以它应该看起来像这样:
beforeEach(function (done) {
test = new Test(function (cb) {
setTimeout(function () {
console.log("in beforeEach() | setTimeout()");
cb(resolvedValue);
done()
}, 500);
});
});
当规范的(it()
部分的)异步操作在所有调用 jasmine 测试方法后在 .then()
方法内完成时,这将告诉 Jasmine 规范已完成 运行ning(因此不会达到超时)。所以:
it("Should be " + resolvedValue, function (done) {
test.then(function (value) {
console.log("in then()");
expect(value).toBe(resolvedValue);
done();
});
});
此外,如您所见,我没有测试变量的值是否已更改,而是测试传递给 .then()
方法的值是否与传递给 promise resolve [=14] 的值相同=] 函数,因为这是您期望的正确行为。
这是您 fiddle 的 updated version。
您可以在浏览器的控制台中查看是否正在调用所有回调
注意:更改 Jasmine 的 DEFAULT_TIMEOUT_INTERVAL 无缘无故地让它变得更加复杂,所以我删除了它和一些无关的代码。
我正在尝试使用 done() 函数对简单的 promise 实现(异步代码)实施 jasmine 测试,但我的测试失败了,尽管被测试的代码工作得很好。 谁能帮我弄清楚我的测试中缺少什么?
var Test = (function () {
function Test(fn) {
this.tool = null;
fn(this.resolve.bind(this));
}
Test.prototype.then = function (cb) {
this.callback = cb;
};
Test.prototype.resolve = function (value) {
var me = this;
setTimeout(function () {
me.callback(value);
}, 5000);
};
return Test;
})();
describe("setTimeout", function () {
var test, newValue = false,
originalTimeout;
beforeEach(function (done) {
originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
test = new Test(function (cb) {
setTimeout(function () {
cb();
}, 5000);
});
test.then(function () {
newValue = true;
console.log(1, newValue);
done();
});
});
it("Should be true", function (done) {
expect(1).toBe(1);
expect(newValue).toBeTruthy();
});
afterEach(function () {
jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
});
});
jsfiddle 中的相同测试:http://jsfiddle.net/ravitb/zsachqpg/
此代码正在测试类似对象的简单承诺,因此为方便起见,将 Test
对象称为承诺。
promise 创建后有两个不同的异步事件:
1..then()
方法的调用
2.通过在beforeEach()
函数中调用cb()
函数来解析promise。
在现实世界中,这两个可以随时以任何顺序调用。
对于测试,必须将 .then()
调用移至 it()
部分的回调,并且需要在其回调中调用所有规范方法(例如 expect()
),否则它们' ll 运行 在解决之前。 beforeEach()
是测试设置的一部分,而 it()
函数是规范,即测试本身。
done()
方法需要调用两次,
当
beforeEach()
异步操作完成时(即在调用cb()
之后),将开始 运行 规范。所以它应该看起来像这样:beforeEach(function (done) { test = new Test(function (cb) { setTimeout(function () { console.log("in beforeEach() | setTimeout()"); cb(resolvedValue); done() }, 500); }); });
当规范的(
it()
部分的)异步操作在所有调用 jasmine 测试方法后在.then()
方法内完成时,这将告诉 Jasmine 规范已完成 运行ning(因此不会达到超时)。所以:it("Should be " + resolvedValue, function (done) { test.then(function (value) { console.log("in then()"); expect(value).toBe(resolvedValue); done(); }); });
此外,如您所见,我没有测试变量的值是否已更改,而是测试传递给 .then()
方法的值是否与传递给 promise resolve [=14] 的值相同=] 函数,因为这是您期望的正确行为。
这是您 fiddle 的 updated version。
您可以在浏览器的控制台中查看是否正在调用所有回调
注意:更改 Jasmine 的 DEFAULT_TIMEOUT_INTERVAL 无缘无故地让它变得更加复杂,所以我删除了它和一些无关的代码。