gpt4 book ai didi

asynchronous - 使用 done() 在 Jasmine 2.0.0 中测试异步功能

转载 作者:行者123 更新时间:2023-12-04 11:51:01 25 4
gpt4 key购买 nike

我正在尝试使用 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/

最佳答案

这段代码正在测试一个类似对象的简单 promise ,因此将调用 Test反对一个方便的 promise 。

Promise 创建后有两个不同的异步事件:
1.调用.then()方法
2. 通过调用cb() 解决promise beforeEach() 中的函数功能。

在现实世界中,这两个可以在任何时间以任何顺序调用。

对于测试,.then()调用必须移至 it()部分的回调和所有规范方法(例如 expect() )需要在其回调中调用,否则它们将在解决之前运行。 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() 部分的)异步操作在 .then() 内完成时在所有调用 jasmine 测试方法之后的方法,这将告诉 Jasmine 规范已完成运行(因此不会达到超时)。所以:
    it("Should be " + resolvedValue, function (done) {
    test.then(function (value) {
    console.log("in then()");
    expect(value).toBe(resolvedValue);
    done();
    });
    });

  • 此外,正如您所看到的,我没有测试变量的值是否已更改,而是测试传递给 .then() 的值。方法与传递给 promise resolve cb() 的方法相同功能,因为这是您期望的正确行为。

    这是 updated version你的 fiddle 。

    您可以在浏览器的控制台中查看是否正在调用所有回调

    注意:更改 Jasmine 的 DEFAULT_TIMEOUT_INTERVAL 只会无缘无故地让它变得更加复杂,所以我删除了它和一些无关的代码。

    关于asynchronous - 使用 done() 在 Jasmine 2.0.0 中测试异步功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28408843/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com