Тесты машинописи E2E не переносятся после обновления Angular - PullRequest
0 голосов
/ 20 сентября 2018

У меня проблема с тестами e2e в проекте после того, как я выполнил обновление до Angular 6. Ранее тесты работали отлично, теперь есть проблема, что файлы .ts не компилируются: Ошибка: TSError: ⨯ Не удаетсяскомпилировать TypeScript .У меня ничего не изменилось после миграции в файл angular.json.Я пытался найти, какие именно свойства в конфигурации отвечают за перенос, но не смог найти какой-либо конкретный ответ.Тогда я предположил, что это

beforeLaunch: function() {
    require('ts-node').register({
      project: 'e2e/tsconfig.e2e.json'
   });
},

Кто-нибудь знает, что может быть не так?

  • Версия узла: v8.11.4
  • Версия транспортира: 5.4.0
  • Угловая версия: 6.1.6
  • Версия угловой CLI:6.1.5
  • Браузер (ы): Chrome
  • Операционная система и версия Windows 10.0.17134
  • protractor.conf.js

    const { SpecReporter } = require('jasmine-spec-reporter');
    const jasmineReporters = require('jasmine-reporters');
    const protractorImageComparison = require('protractor-image-comparison');
    require('ts-node/register');
    require('tsconfig-paths/register');
    const { LoginWindow } = require('./e2e/loginWindow.po.js');
    exports.config = {
        allScriptsTimeout: 30000,
        specs: [
           './e2e/**/*.e2e-spec.ts'
        ],
    capabilities: {
        'browserName': 'chrome',
        chromeOptions: {
          args: [ "--no-sandbox", "--disable-gpu", "--window-size=1920x1080" ]
        }
      },
      directConnect: true,
      baseUrl: 'http://localhost:4300/',
      framework: 'jasmine',
      jasmineNodeOpts: {
        showColors: true,
        defaultTimeoutInterval: 30000,
        print: function() {}
      },
      beforeLaunch: function() {
        require('ts-node').register({
          project: 'e2e/tsconfig.e2e.json'
        });
      },
      onPrepare() {
        jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
        jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
          consolidateAll: true,
          savePath: './',
          filePrefix: '...'
        }));
        browser.protractorImageComparison = new protractorImageComparison(
          {
            actualFolder: '...',
            baselineFolder: '...',
            diffFolder: '...',
            screenshotPath: '...',
            tempFullScreenFolder: '...',
            autoSaveBaseline: true,
            ignoreAntialiasing: true,
            ignoreTransparentPixel: true,
          }
        );
    
        loginPage = new LoginWindow();
        browser.waitForAngularEnabled(false).then(() => {
          return browser.get('...').then(() => {
            loginPage.loginWindowInternal().click().then(() => {
              browser.sleep(5000);
            }).then(() => {
              loginPage.loginWindowUserName().isPresent().then((result) => {
                if (result) {
                 ...
                  browser.sleep(5000);
                }
              });
            });
          });
        });
      }
    };
    
  • tsconfig.e2e.json

    {
      "extends": "../tsconfig.json",
      "compilerOptions": {
        "outDir": "../out-tsc/e2e",
        "module": "commonjs",
        "target": "es5",
        "types":[
          "jasmine",
          "node"
        ]
      }
    }
    
  • tsconfig.json

    {
      "compileOnSave": false,
      "compilerOptions": {
        "outDir": "./dist/out-tsc",
        "baseUrl": "src",
        "sourceMap": true,
        "declaration": false,
        "moduleResolution": "node",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "target": "es5",
        "typeRoots": [
          "node_modules/@types"
        ],
        "lib": [
          "es2016",
          "dom"
        ],
        "paths": {
          ...
        },
    "module": "es2015"
      }
    }
    
  • angular.json

    {
      "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
      "version": 1,
      "newProjectRoot": "projects",
      "projects": {
         ...
        "...-e2e": {
          "root": "e2e",
          "sourceRoot": "e2e",
          "projectType": "application",
          "architect": {
            "e2e": {
              "builder": "@angular-devkit/build-angular:protractor",
              "options": {
                "protractorConfig": "./protractor.conf.js"
              }
            },
            "lint": {
              "builder": "@angular-devkit/build-angular:tslint",
              "options": {
                "tsConfig": [
                  "e2e/tsconfig.e2e.json"
                ],
                "exclude": []
              }
            }
          }
        }
      },
      "defaultProject": "...",
      "schematics": {
        "@schematics/angular:component": {
          "prefix": "app",
          "styleext": "scss"
        },
        "@schematics/angular:directive": {
          "prefix": "app"
        }
      }
    }
    
  • Вывод результатов выполнения теста

    [11:44:42] E/launcher - ### Error: TSError: ⨯ Unable to compile TypeScript:
    e2e/....e2e-spec.ts(27,111): error TS2322: Type '0' is not assignable to type '{ label: number; sent: () => any; trys: any[]; ops: any[]; }'.
    
    at createTSError (...\node_modules\ts-node\src\index.ts:261:12)
    at getOutput (...\node_modules\ts-node\src\index.ts:367:40)
    at Object.compile (...\node_modules\ts-node\src\index.ts:558:11)
    at Module.m._compile (...\node_modules\ts-node\src\index.ts:439:43)
    at Module.m._compile (...\node_modules\ts-node\src\index.ts:439:23)
    at Module._extensions..js (module.js:663:10)
    at require.extensions.(anonymous function) (...\node_modules\ts-node\src\index.ts:442:12)
    at Object.require.extensions.(anonymous function) [as .ts] (...\node_modules\ts-node\src\index.ts:442:12)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    [11:44:42] E/launcher - Process exited with error code 100
    An unexpected error occurred: undefined
    

ПРИМЕЧАНИЕ. Я почти уверен, что проблема заключается в том, что не компилируются файлы машинописного текстапотому что, когда я изменил файл LoginWindow на класс машинописного текста и импортировал его в protractor.conf.js

const { LoginWindow } = require('./e2e/loginWindow.po');

, я получил ошибку:

[11:16:01] E/configParser - ...\e2e\loginWindow.po.ts:1
(function (exports, require, module, __filename, __dirname) { import { browser, element, by } from 'protractor';
                                                              ^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Module.m._compile (...\node_modules\ts-node\src\index.ts:439:23)
    at Module._extensions..js (module.js:663:10)
    at Object.require.extensions.(anonymous function) [as .ts] (...\node_modules\ts-node\src\index.ts:442:12)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
An unexpected error occurred: undefined

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Полагаю, вам не нужно включать в tsconfig.e2e.ts, если у вас есть следующие опции в файле conf

onPrepare() {
    require('ts-node').register({
      project: require('path').join(__dirname, './tsconfig.e2e.json')
    });
    ...
    ...
  }

В приведенном выше коде вы фактически включаете 'tsconfig.e2e.Я чувствую, что вам не нужно беспокоиться о порядке.

0 голосов
/ 20 мая 2019

Я нашел решение сам.Извините, все, что начали эту награду, я больше не могу ее остановить.

Я обнаружил, что в моем protractor.conf.js отсутствуют следующие 2 записи:

// put this directly after 'allScriptsTimeout: xxxxx'
// the given path starts inside your e2e-folder!
specs: [
    './test-files/*.e2e.ts'
],

// and then extend the onPrepare-function
onPrepare: function() {
    require('ts-node').register({
        project: './e2e/tsconfig.e2e.json'
    });

    ...
}

Кроме того, мне пришлось поменять местами include и compilerOptions inside tsconfig.e2e.ts .Если compilerOptions предшествует include , вы столкнетесь с ошибкой.

{
    "extends": "../tsconfig.json",
    "include": [
        "**/*.e2e.ts"
    ],
    "compilerOptions": {
        ...
    }
...