【发布时间】:2017-05-10 00:03:37
【问题描述】:
我在目前的项目中遇到了几种情况,我有一系列的承诺,我不知道如何处理。
以下是相关代码块:
return this.axios.get(path, requestOpts)
.then((response) => {console.log('did authorize: ', response); return response})
.then((response) => {
if (response.data.ok) {
window.localStorage.setItem(path, JSON.stringify(response.data));
console.log("Setting localStorage item ", path, response.data);
return response.data.payloadUrl;
} else {
console.error("Non-ok response for ", path, response.data);
const resp: DisplayTokenResponse = response.data;
//TODO: reject promise?
if (resp.status === "AUTHENTICATION_REQUIRED") {
this.axiosService.goToLoginPage(window.location + '');
}
Promise.reject(response.data.message);
}
});
我的测试(到目前为止)如下所示:
describe('.authorize()', () => {
let axiosSpy: jasmine.Spy;
beforeEach((done) => {
spyOn(svc, 'keyPath').and.returnValue(path);
spyOn(svc, 'storedToken').and.returnValue(stored);
let response = {
data: {
ok: true,
message: 'test-response',
payloadUrl: 'http://payload-url.com'
}
}
spyOn(svc.axios, 'get').and.callFake(
(path:string, reqOpts:AxiosRequestConfig) => {
return new Promise(() => {
response
});
}, (e) => {
console.log(`failed`);
});
});
describe('should authorize user', () => {
it('when supplied a STRING', () => {
clientId = clientId_string;
});
it('when supplied a NUMBER', () => {
clientId = clientId_number;
});
afterEach((done) => {
svc.authorize(clientId, locationId, screenId).then((result) => {
console.log(`result ${result}`);
done();
}, (e) => {
console.log(`failed with error ${e}`);
done();
});
});
});
});
我可以测试一级向下的 Promise,但是我如何设置我的测试以能够处理这样的情况?
【问题讨论】:
-
您能否详细说明您所指的“情况”?此外,如果您希望从外部注意到拒绝,则必须始终从
then块返回 Promise ->**return** Promise.reject(response.data.message); -
我的意思是当一个 Promise 通过多个这样的
.then语句链接时。我正在尝试验证它是否在每个步骤中都能解决。当我尝试模拟来自this.axios.get的初始承诺的响应时,测试超时而没有返回任何内容。根据日志,它似乎永远不会进入第二个.then的接受/拒绝阶段。
标签: javascript unit-testing typescript jasmine