请求承诺 - 本地不链接'然后'正如工作API调用所期望的那样

时间:2017-11-06 16:51:06

标签: javascript node.js angular typescript protractor

使用' request-native-promise'没有正确地链接到它随后的'然后'并且'赶上'处理程序。

我的量角器测试

    // There's a bunch of other imports here
    import { browser } from "protractor";
    const RequestPromise = require('request-promise-native');

    describe('spec mapper app', () => {
        let specMapperPage: SpecMapperPage;
        let specMapperFVRPage: SpecMapperFieldsValuesReviewPage;
        let loginLogoutWorkflow: LoginLogoutWorkflow;
        let apiToken: LoginToken;
        let tokenUtil: TokenUtil;
        let projectRecordsToBeDeleted = [];
        let requestHandler;
        let logger = new CustomLogger("spec mapper app");
        let speccyEndpoints = new SpeccyEndpoints();

        beforeAll( () => {
            logger.debug("Before All")
            loginLogoutWorkflow = new LoginLogoutWorkflow();
            loginLogoutWorkflow.login();
            tokenUtil = new TokenUtil();
            tokenUtil.getToken().then((token:LoginToken) => {
                apiToken = token;
                requestHandler = new SpeccyRequestHandler(apiToken);
            });
        });

        describe('import/export page', () => {

            it('TC2962: I'm a test case', () => {
                let testLogger = new CustomLogger("TC2955");
                // Test Var setup
                ... // removed for brevity

                // Test Setup
                browser.waitForAngularEnabled(false);
                // Setup the record to be on the mapper page
                let body = speccyEndpoints.generateRevitPostBody(PROJECT_ID, fileName);

                requestHandler.postToSpeccy(speccyEndpoints.DELITE_REVIT_POST_URI, body).then((response) => { // EDIT: removed non-existant argument "rejection"
                    // --> The then handler the promise is STILL not resolving into
                    // Only made it here like once
                    console.log("Response is: ");
                    console.log(response);

                    // I got this to work once, but now it's not
                    console.log("Response body is: ");
                    console.log(response.body);
                }).catch(error => {
                    // --> The catch handler is ALSO NOT resolving
                    console.log("catch handler executed!");
                    console.log(error);
                });        
            });
        });
    });

出现问题的测试用例。我的console.log("Response is: ");没有被输出。我没有收到有关原因的错误消息。

My Speccy Request Handler Wrapper Class

import * as RequestPromise from "request-promise-native";
import {LoginToken} from "../testObjects/LoginToken";
import {CustomLogger} from "../logging/CustomLogger";

export class SpeccyRequestHandler {

    _baseAPIURL = 'http://myapi.net/';
    _options = {
        method: '',
        uri: '',
        auth: {
            'bearer': ''
        },
        headers: {
            'User-Agent': 'client'
        },
        "resolveWithFullResponse": true,
        body: {},
        json: true
    };
    _logger;

    constructor(apiToken: LoginToken) {
        this._options.auth.bearer = apiToken.idToken;
        this._logger = new CustomLogger(SpeccyRequestHandler.name);
    }

    getOptions() {
        return this._options;
    }

    postToSpeccy(uri:string, body?) {
        this._options.method = 'POST';
        this._options.uri = this._baseAPIURL + uri;
        if(body) {
            this._options.body = body;
        }
        return RequestPromise(this._options);
    }

    getFromSpeccy(uri) {
        this._options.method = 'GET';
        this._options.uri = this._baseAPIURL + uri;
        return RequestPromise(this._options);
    }
}

这是我的一个API专用的Request Handler,Speccy one,并且在URL和令牌传递中有一些自定义方面。

来源

Request-Promise-Native Github Page
Request-Promise Github page, documentation location

更新号码

修复@tomalak引起我的注意后,我{/ 1}}处理程序中的console.log正在执行,我转换后的前5个小时对此,我得到了响应对象的大约150多行控制台日志,其中包含我希望从我的请求URI中获得的响应。我甚至使用.then(...将身体排除在外。我认为事情是固定的,我没有使用我的记录器登出文件,所以我丢失了我的证据。现在,当我运行此测试和此请求时,我根本不会进入response.body处理程序。我也没有进入捕获。我的请求正在工作,因为我的资源是在命中后期端点时创建的。任何进一步的建议表示赞赏

什么会导致某些事情有时起作用而不是其他事情?我唯一想到的可能是我的请求处理程序中的通用.then(...名称并没有被用来代替被捕获的构建链上方的另一个方法。

更新2号

删除了一堆东西来缩短我的问题。如果您需要更多说明,请询问,我会添加它。

1 个答案:

答案 0 :(得分:0)

最终在API结束时超时。我的回答只是花了太长时间才回到我身边。它没有失败,所以它永远不会陷入困境。我让它在某一点上起作用,因为长时间的响应是由于我们系统中特定资源的过多。我以为是我和我写错了。长话短说,怀疑你的系统,即使你认为它是完美的,或者如果你的开发者上下发誓什么都不会被打破。

此外,请求调试模块是一件好事,必须证明其他端点(例如https://jsonplaceholder.typicode.com/上的其他测试端点)可以与您的代码一起使用。