Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度量角器:在测试之前,等待每个页面的所有API调用_Angular_Api_Protractor - Fatal编程技术网

Angular 角度量角器:在测试之前,等待每个页面的所有API调用

Angular 角度量角器:在测试之前,等待每个页面的所有API调用,angular,api,protractor,Angular,Api,Protractor,我想做的是通过导航到应用程序的多个页面来测试我的应用程序,但我想做的是,当我从一个页面导航到另一个页面时,我希望在执行操作(单击按钮等)之前完成所有API调用,如果API调用失败,则中断测试并触发错误 我的量角器.conf.js const { SpecReporter } = require('jasmine-spec-reporter'); exports.config = { allScriptsTimeout: 11000, specs: [ './e2e/**/*.e

我想做的是通过导航到应用程序的多个页面来测试我的应用程序,但我想做的是,当我从一个页面导航到另一个页面时,我希望在执行操作(单击按钮等)之前完成所有API调用,如果API调用失败,则中断测试并触发错误

我的量角器.conf.js

const { SpecReporter } = require('jasmine-spec-reporter');

exports.config = {
  allScriptsTimeout: 11000,
  specs: [
    './e2e/**/*.e2e-spec.ts'
  ],
  capabilities: {
    'browserName': 'chrome'
  },
  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() {}
  },
  onPrepare() {
    require('ts-node').register({
      project: 'e2e/tsconfig.e2e.json'
    });
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
  }
};
编辑:示例:

import { AppPage } from './app.po';
import { element, by, browser } from 'protractor';

describe('my App', () => {
  let page: AppPage;

  beforeEach(() => {
    page = new AppPage();
  });

  it('check log in', () => {
    browser.waitForAngularEnabled(false);
    page.navigateTo(); 
    element(by.name('email')).sendKeys('...');
    element(by.name('password')).sendKeys('...');
    element(by.buttonText('Log in')).click(); 
    browser.sleep(5000);
    expect(element(by.id('tenantSelect')).isPresent()).toBe(true); 
  });
});

所以基本上这个测试是在我的angular应用程序中登录的场景。当我点击“登录”按钮时,它会触发API调用并导航到另一个组件tenantSelect'是我的DOM的一个元素,当用户登录时会显示该元素,但即使我的某个HTTP请求出现故障,也会显示该元素。我想要的是捕获过程中的http请求错误并使测试失败。

您需要的是组件的解析器。见相关文件

基本上,解析器确保在加载组件之前完成API调用(或任何其他可观察的调用)


直接在量角器配置中实现解决方案可能会使您的测试变为绿色,但在prod中部署时,您的应用程序将无法按预期工作,并且您会在浏览器日志中看到许多错误。

由于我的Angular project中有许多组件,我不想为我的项目的所有组件实现解析器,我只是在寻找一种方法来访问应用程序发出的API调用响应。我将编辑我的主题以向您展示一个示例e2e测试IMO的要点是模拟用户可以与您的应用程序进行的真实交互。当接收到后端响应时,它可能会触发UI中的更改,您可以使用量角器进行测试,而无需捕获API请求。测试后端请求是否发生,比如说,在点击按钮时,更像是一个集成测试;这些测试可以用angular testbed/jasmine/karma/jest或任何你的单元测试堆栈编写。刚刚看到你的编辑,我重申:如果你的应用程序的预期行为是无论API调用响应如何都加载组件,那么你的应用程序工作正常。如果您希望您的应用程序显示错误消息/404页面或其他任何内容,您应该为此编写一个测试用例并实现它。您需要编辑您的http服务来处理感谢您的帮助