Доступ к конструктору сервисов angular в среде тестирования Jest

Я изо всех сил пытаюсь найти ответ на следующий вопрос (и я уверен, что более чем вероятно, что ответ относительно прост) ...

Я тестирую приложение Ionic 3.4, используя среду тестирования Jest, и не могу понять, как вызвать службу angular для тестирования, где конструктор инициализирует объект Http и объект плагина InAppBrowser Ionic Native.

Мой файл package.json содержит следующую конфигурацию:

...
"jest": {
    "transform": {
        ".(ts|tsx)": "<rootDir>/node_modules/ts-jest/preprocessor.js"
    },
    "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
    "moduleFileExtensions": [
        "ts",
        "tsx",
        "js",
        "json"
    ]
},
"devDependencies": {
    "@types/jest": "^20.0.2",
    "@types/node": "^7.0.31",
    "jest": "^20.0.4",
    "ts-jest": "^20.0.6",
    "ts-node": "^3.0.6",
    "tslint": "^5.4.3",
    "tslint-eslint-rules": "^4.1.1",
    "typescript": "2.3.3"
},
...

Мой файл tsconfig.json, расположенный в каталоге src / unit-tests (чтобы нацеливаться только на этот каталог и его содержимое и не мешать корневому файлу tsconfig.json для проекта Ionic), является следующее:

{
    "compilerOptions" : {
        "module"                        : "commonjs",
        "allowSyntheticDefaultImports"  : true,
        "experimentalDecorators"        : true,
        "noImplicitAny"                 : false,
        "removeComments"                : false,
        "locale"                        : "en-GB",
        "alwaysStrict"                  : true,
        "skipLibCheck"                  : true,
        "pretty"                        : true
    }
}

Запрашиваемая услуга - provider / settings / settings.ts - выглядит следующим образом:

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { InAppBrowser } from '@ionic-native/in-app-browser';
import 'rxjs/add/operator/map';


@Injectable()
export class SettingsProvider {

constructor(public http     : Http,
            private _INAPP  : InAppBrowser) 
{  }

// Methods follow here
}

Затем он используется в файле settings.test.ts следующим образом:

import 'reflect-metadata';
import { SettingsProvider } from '../providers/settings/settings';


let settings = null;

beforeEach(() => {
  // The following works IF the SettingsProvider class 
  // contains NO parameters in the constructor
  settings = new SettingsProvider();
});



describe('Settings service', () => 
{
    // Tests are defined within here
    // using methods supplied by the 
    // SettingsProvider class
});

ЕСЛИ я беру параметры из конструктора класса SettingsProvider, Jest может запускать тесты точно так, как задумано (пройден или не пройден).

С параметрами внутри конструктора класса SettingsProvider Jest задыхается при попытке запустить тестовый сценарий со следующей ошибкой:

 Test suite failed to run

/ionic-unit/node_modules/@ionic-native/in-app-browser/index.js:20
import { Injectable } from '@angular/core';
^^^^^^
SyntaxError: Unexpected token import

  at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/ScriptTransformer.js:289:17)
  at Object.<anonymous> (src/providers/settings/settings:12:21)
  at Object.<anonymous> (src/unit-tests/settings.test.ts:2:18)

Как мне настроить мой тестовый сценарий так, чтобы Jest распознавал модули, инициализированные в конструкторе SettingsProvider?

Я относительно новичок в модульном тестировании и пытаюсь понять, как это сделать (но, как вы можете сказать, пока без особой радости!)

Я ценю любые советы / рекомендации разработчиков по этому поводу.

Спасибо!


person EinZweiDrei    schedule 29.06.2017    source источник


Ответы (1)


Я еще не использовал Jest - обычно я работаю с jasmine / karma, установленным по умолчанию командой @angular, - но нельзя ли использовать Стенд для настройки?

С кармой / жасмином вы можете сделать что-то вроде этого:

beforeEach(async(() => {
TestBed.configureTestingModule({
    providers: [
        Http,
        InAppBrowser
    ],
})
}));

beforeEach(async(() => TestUtils.beforeEachCompiler([]).then(compiled => {
    fixture = compiled.fixture;
    instance = compiled.instance;
    fixture.autoDetectChanges(true);

})));
person Christian Benseler    schedule 29.06.2017
comment
Привет, Кристиан - спасибо за вклад. Я сознательно выбрал Jest, поскольку установка для его использования в проекте Ionic имеет довольно минимальное / низкое влияние (взглянув на другие конфигурации / установки - и их сложность в закладке основы для сравнения - для использования различных структур тестирования в рамках Ионный). Я не исследовал использование Testbed в контексте Jest, но это то, что я определенно мог бы исследовать) - person EinZweiDrei; 29.06.2017