Я изо всех сил пытаюсь найти ответ на следующий вопрос (и я уверен, что более чем вероятно, что ответ относительно прост) ...
Я тестирую приложение 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?
Я относительно новичок в модульном тестировании и пытаюсь понять, как это сделать (но, как вы можете сказать, пока без особой радости!)
Я ценю любые советы / рекомендации разработчиков по этому поводу.
Спасибо!