我们正在使用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请求。我是否遗漏了一些解释此行为的重要配置/设置?
答案 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();
}
});