带有ng-apimock的量角器没有在所有http测试请求中添加ngapimockid

时间:2018-01-19 16:23:54

标签: angular protractor

我们正在使用ng-apimock来测试我们的角度应用。要在某些测试中返回特定数据集,我们使用ngApiMock.selectScenario 当我查看selectScenario的http请求时(在tcp监视器中),我看到一个标题添加了密钥ngapimockid(以及生成的值)。

但是,在执行测试时,我注意到ngapimockid通常未在标题中指定(或作为Cookie),从而导致接收除ngApiMock.selectScenario中的设置之外的其他数据。

例如执行测试期间的http请求(使用ngapimockid):

GET /somerandomuri HTTP/1.1
cookie: ngapimockid=46206072-c0e3-44f3-b93c-4e1658db9d46
accept-language: en-US,en;q=0.9
accept-encoding: gzip, deflate, br
referer: http://localhost:49152/
user-agent: Moz.......

在同一测试执行期间没有ngapimockid(到同一端点)的http请求示例:

GET /somerandomuri HTTP/1.1
accept-language: en-US,en;q=0.9
accept-encoding: gzip, deflate, br
referer: http://localhost:49152/
user-agent: Moz.......

我认为ngapimockid用于支持不同场景的并行测试,但我无法理解为什么在测试期间经常没有添加它。 我认为protractor.mock.js的以下部分负责添加将ngapimockid添加到测试http请求的钩子:

/** Make sure that angular uses the ngapimock identifier for the requests. */
browser.getProcessedConfig().then((config) => {
    // As of protractor 5.0.0 the flag config.useAllAngular2AppRoots has been deprecated, to let protractor tell
    // ngApimock that Angular 2 is used a custom object needs to be provided with the angular version in it
    // See: https://github.com/angular/protractor/blob/master/CHANGELOG.md#features-2
    if (config.useAllAngular2AppRoots || ('ngApimockOpts' in config && config.ngApimockOpts.angularVersion > 1)) {
        // angular 2 does not have addMockModule support @see https://github.com/angular/protractor/issues/3092
        // fallback to cookie
        require('hooker').hook(browser, 'get', {
            post: function (result) {
                return result.then(function () {
                    // Since protractor 5.0.0 the addCookie is an object, see
                    // https://github.com/angular/protractor/blob/master/CHANGELOG.md#500
                    try {
                        return browser.manage().addCookie({name: "ngapimockid", value: ngapimockid});
                    } catch (error) {
                        // Fallback protractor < 5.0.0
                        return browser.manage().addCookie('ngapimockid', ngapimockid);
                    }
                });
            }
        });

        // Angular 2+ lacks addMockModule, but hybrid apps still need this
        if(!!config.ngApimockOpts.hybrid) {
            browser.addMockModule('ngApimock', ProtractorMock, {ngapimockid: ngapimockid});
        }
    } else {
        browser.addMockModule('ngApimock', ProtractorMock, {'ngapimockid': ngapimockid})
    }

再次不理解为什么它不能适用于所有http请求。我是否遗漏了一些解释此行为的重要配置/设置?

1 个答案:

答案 0 :(得分:0)

再次看一下tcpmonitor,我发现没有ngapimockid的请求是选择场景后的第一个http请求(在Background文件的feature中)和第一个进入我的考试(Scenario outline)。

所以我怀疑页面的打开发生在量角器的域之外。 (即使我在场景选择后看到它发生在tcpmonitor中。)

我在页面刷新的Background中添加了一个步骤,在http调用中,我确实看到了请求标头中的ngapimockid。所以现在我通过在刷新页面的场景选择之后添加步骤And I have opened the page来修复它。

结果要素文件的一部分:

Feature: Create XXX

    I want to be able to create new XXX
    So that we can do something exciting

    Background:
        Given the "empty" XXX set
        And I have opened the page


    Scenario Outline: Create XXX 

结果步骤文件的一部分:

defineSupportCode(function({ Before, Given }) {

    Given(/^I have opened the page$/, openPage);
    async function openPage() {
        await browser.refresh();
    }
});