【问题标题】:Testing Chained Promises (Jasmine, React, Karma)测试链式 Promise(Jasmine、React、Karma)
【发布时间】: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


【解决方案1】:

终于弄明白了。我认为这源于创建 Promise 实例与其解析器之间的混淆。

新的 beforeEach 块如下所示:

    beforeEach(() => {
        spyOn(svc, 'keyPath').and.returnValue(path);
        spyOn(svc, 'storedToken').and.returnValue(stored);

        let axiosPromise = new Promise((resolve, reject) => {
            var responseData = {
                data: {
                    ok: true,
                    message: 'test-response',
                    payloadUrl: 'http://payload-url.com'
                }
            };

            resolve(responseData);
        });

        spyOn(svc.axios, 'get').and.callFake(
            ()=>{
                return axiosPromise;
            }
        );
    });

我的测试现在通过了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-25
    • 2015-12-07
    • 1970-01-01
    • 2018-01-31
    • 2014-05-04
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多