Jasmine 4:异步功能未在 5000 毫秒内完成问题
Jasmine 4: Async function did not complete within 5000ms issue
我有一个现有的异步函数:
async doJSONGetRequest(getUrl, accessToken) {
return new Promise(function(resolve, reject) {
const reqHeaders = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`,
};
console.info('url = ' + getUrl);
request.get({
url: getUrl,
headers: reqHeaders,
}, function(err, response) {
if (err) return reject(err);
try {
// console.debug(`response = ${response.body}`);
const parsed = JSON.parse(response.body);
return resolve(parsed);
} catch (err) {
return reject(err);
}
});
});
}
}
我正在尝试使用 Jasmine(v4) 对其进行测试。
当然,我不希望这个东西实际发出 HTTP 请求,所以我尝试在 'beforeAll' 部分的 'request' 包的 'get' 函数上安装一个间谍:
describe('RAPIDAPIService', function() {
beforeAll(async function() {
spyOn(request, 'get')
.and
.callFake(async (parameters) => {
if (parameters.url === 'http://localhost/api/getSomething') {
const rsp = {};
rsp.body = 'good stuff';
return rsp;
} else if (parameters.url === 'http://localhost/api/whoops') {
return new Error('401 not found');
} else {
return null;
}
});
});
it('doJSONGetRequest should run successfully', async () => {
expect(api.doJSONGetRequest).toBeDefined();
const res = await api.doJSONGetRequest('http://localhost/api/getSomething', '12345678');
expect(data).toEqual('good stuff');
});
it('doJSONGetRequest should resolve errors properly', async () => {
expect(api.doJSONGetRequest).toBeDefined();
const res = await api.doJSONGetRequest('http://localhost/api/whoops', '12345678');
const expectedError = new Error('401 not found');
expect(res).toEqual(expectedError);
});
控制台日志语句似乎表明我实际上正在通过“it”测试中的“await”调用返回/返回某些内容。但间谍实际上正在工作/检测到 url 已被调用。
(请注意,我没有在同一个文件中包含其他测试,这些测试不会进行异步调用并且正在运行...只是为了让您知道访问实际的“api”没有问题图书馆及其功能。)
这两个测试一直失败,并显示“错误:超时 - 异步功能未在 5000 毫秒内完成”。就像我说的,他们似乎没有从调用 doJSONGetRequest 函数返回到测试。
有什么想法吗?
谢谢!
我认为问题出在嘲讽上。 request.get
似乎有两个参数,我认为您需要在完成后调用第二个参数(回调函数),以便可以调用 resolve
。
试试这个:
spyOn(request, 'get')
.and
// add callbackFunction as 2nd argument
.callFake((parameters, callbackFunction) => {
if (parameters.url === 'http://localhost/api/getSomething') {
const rsp = {};
rsp.body = 'good stuff';
callbackFunction(null, rsp);
} else if (parameters.url === 'http://localhost/api/whoops') {
callbackFunction({ error: '401 not found' }, {});
} else {
callbackFunction(null, null);
}
});
我有一个现有的异步函数:
async doJSONGetRequest(getUrl, accessToken) {
return new Promise(function(resolve, reject) {
const reqHeaders = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`,
};
console.info('url = ' + getUrl);
request.get({
url: getUrl,
headers: reqHeaders,
}, function(err, response) {
if (err) return reject(err);
try {
// console.debug(`response = ${response.body}`);
const parsed = JSON.parse(response.body);
return resolve(parsed);
} catch (err) {
return reject(err);
}
});
});
}
}
我正在尝试使用 Jasmine(v4) 对其进行测试。 当然,我不希望这个东西实际发出 HTTP 请求,所以我尝试在 'beforeAll' 部分的 'request' 包的 'get' 函数上安装一个间谍:
describe('RAPIDAPIService', function() {
beforeAll(async function() {
spyOn(request, 'get')
.and
.callFake(async (parameters) => {
if (parameters.url === 'http://localhost/api/getSomething') {
const rsp = {};
rsp.body = 'good stuff';
return rsp;
} else if (parameters.url === 'http://localhost/api/whoops') {
return new Error('401 not found');
} else {
return null;
}
});
});
it('doJSONGetRequest should run successfully', async () => {
expect(api.doJSONGetRequest).toBeDefined();
const res = await api.doJSONGetRequest('http://localhost/api/getSomething', '12345678');
expect(data).toEqual('good stuff');
});
it('doJSONGetRequest should resolve errors properly', async () => {
expect(api.doJSONGetRequest).toBeDefined();
const res = await api.doJSONGetRequest('http://localhost/api/whoops', '12345678');
const expectedError = new Error('401 not found');
expect(res).toEqual(expectedError);
});
控制台日志语句似乎表明我实际上正在通过“it”测试中的“await”调用返回/返回某些内容。但间谍实际上正在工作/检测到 url 已被调用。
(请注意,我没有在同一个文件中包含其他测试,这些测试不会进行异步调用并且正在运行...只是为了让您知道访问实际的“api”没有问题图书馆及其功能。)
这两个测试一直失败,并显示“错误:超时 - 异步功能未在 5000 毫秒内完成”。就像我说的,他们似乎没有从调用 doJSONGetRequest 函数返回到测试。
有什么想法吗?
谢谢!
我认为问题出在嘲讽上。 request.get
似乎有两个参数,我认为您需要在完成后调用第二个参数(回调函数),以便可以调用 resolve
。
试试这个:
spyOn(request, 'get')
.and
// add callbackFunction as 2nd argument
.callFake((parameters, callbackFunction) => {
if (parameters.url === 'http://localhost/api/getSomething') {
const rsp = {};
rsp.body = 'good stuff';
callbackFunction(null, rsp);
} else if (parameters.url === 'http://localhost/api/whoops') {
callbackFunction({ error: '401 not found' }, {});
} else {
callbackFunction(null, null);
}
});