gpt4 book ai didi

javascript - Mocha - 测试 Promise, `done` 永远不会在 Promise 中被调用

转载 作者:行者123 更新时间:2023-11-29 19:27:59 26 4
gpt4 key购买 nike

我正在尝试测试一个将在 promise 的 .then block 中调用的 spy ,但是 then 中的 done > block 似乎根本没有被执行。

我得到 超过 2000 毫秒的超时。

这是我正在测试的内容(异步):

/**
* Passed down to the LoginForm component to
* handle form submission.
*/
_submitHandler(data) {
return function(evt) {
evt.preventDefault && evt.preventDefault();
evt.stopPropagation && evt.stopPropagation();

return request('post', 'auth', data)
.then((res) => {
AuthActions.login();
return res;
})
}
}

这是我的测试:

describe('when it succeeds', () => {
it('should login', (done) => {
sinon.spy(AuthActions, 'login');

Instance._submitHandler({})({})
.then((res) => {
console.log('Called!!!');
expect(AuthActions.login.called).to.equal(true);
AuthActions.login.restore();
done();
}, done);
});
});

我正在使用 Karma 来运行我的测试;柴和诗乃。

最佳答案

我也有这个问题,原因是在连接打开之前试图响应 XHR,例如

此代码将从 FakeXMLHttpRequest.setResponseHeaders 中抛出 INVALID_STATE_ERR - 0:

describe("get", function () {

beforeEach(function () {
this.xhr = sinon.useFakeXMLHttpRequest();
this.xhr.onCreate = function (request) {
request.respond(200, null, "");
};
});

afterEach(function () {
this.xhr.restore();
});

it("should make a request", function () {
myObject.get("testurl");
});

});

此代码有效:

describe("get", function () {

beforeEach(function () {
this.xhr = sinon.useFakeXMLHttpRequest();
this.requests = [];
this.xhr.onCreate = function (request) {
this.requests.push(request);
};
});

afterEach(function () {
this.xhr.restore();
});

it("should make a request", function () {
myObject.get("testurl");
this.requests[0].respond(200, null, "");
});

});

阅读文档时,它本身确实展示了推送到请求数组的相同技术,我下意识地、不准确地得出这样的印象,即 onCreate,尽管它的名字,更像是“根据请求”。

myObject.get = function (url) {
var http = new XMLHttpRequest();
// the XHR instance exists
// readyState is 0
// onCreate runs now
http.open("GET", url);
http.send();
// readyState is 1
// can call setResponseHeaders and respond
}

结果是您必须在调用运行 XMLHttpRequestsend 的方法之后放置您的响应代码,如:

myObject.get("testurl");
this.requests[0].respond(200, null, "");

我使用的是respond方法,但是setResponseHeaders也是如此(respond调用setResponseHeaders) --在你的测试中它被调用得太早了。

关于javascript - Mocha - 测试 Promise, `done` 永远不会在 Promise 中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29810939/

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