5

ngUpgradeng1 から ng2 に移行するために使用しようとしていますが、アップグレード中に Karma/Jasmine テストを通過させようとしていますが、理解できないエラーが発生しています。

Service ( Data) を ng2@Injectableにアップグレードし、upgradeAdapter.downgradeNg2Providerそれを ng1 アプリに挿入していました。プロダクションコードでは問題なく動作します。

しかし、テストで $inject しようとすると、次のエラーが発生します。

Error: [$injector:unpr] Unknown provider: ng2.InjectorProvider <- ng2.Injector <- Data

ngUpgrade の途中でコードを単体テストする実際の例はありますか? 私のスタックは Webpack ベースです。systemjsガイドに従って変換しようとしましたが、うまくいきませんでした。

カルマ.conf.js :

module.exports = function (config) {
  config.set({
    // base path used to resolve all patterns
    basePath: '',

    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['jasmine'],

    // list of files/patterns to load in the browser
    files: [{ pattern: 'spec.bundle.js', watched: false }],

    // files to exclude
    exclude: [],

    plugins: [
      require('karma-phantomjs-launcher'),
      require('karma-jasmine'),
      require('karma-webpack')
    ],

    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: { 'spec.bundle.js': ['webpack'] },

    webpack: require('./webpack.config'),

    webpackServer: {
      noInfo: true // prevent console spamming when running in Karma!
    },

    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ['progress'],

    // web server port
    port: 9876,

    // enable colors in the output
    colors: true,

    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_INFO,

    // toggle whether to watch files and rerun tests upon incurring changes
    autoWatch: true,

    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    browsers: ['PhantomJS'],

    // if true, Karma runs tests once and exits
    singleRun: false
  });
};

spec.bundle.js

import 'angular';
import 'angular-mocks';

import 'es6-shim';
import 'reflect-metadata';

import 'angular2/src/core/di';
import test from 'angular2/testing';
import browser from 'angular2/platform/testing/browser';

test.setBaseTestProviders(browser.TEST_BROWSER_PLATFORM_PROVIDERS,
                          browser.TEST_BROWSER_APPLICATION_PROVIDERS);

let context = require.context('./src', true, /\.spec\.js/);

context.keys().forEach(context);
4

1 に答える 1

0

実際には、Angular モックのmoduleand をinject使用しないでくださいUpgradeProvider

まだ文書化されていませんが、Angular 2 のソース コードにいくつかの手がかりがあります。

  1. UpgradeAdapterインスタンスはシングルトンである必要があります。
  2. UpgradeAdapterを使用してプロバイダーをシングルトンに追加する必要がありますUpgradeAdapter.addProvider
  3. を使用してアプリを起動し、のコールバック関数に指定されたインスタンスUpgradeAdapter.bootstrapを取得する必要があります。UpgradeAdapterRefready
  4. ng1Injectorインスタンスから属性を取得しUpgradeAdapterRefます。
  5. インジェクターの同期getメソッドを使用してサービスをインスタンス化します。

これがソリューションのプランカーです: https://embed.plnkr.co/EauYut/

また、Wishtack での angular 2 の移行に関するブログ投稿も公開しました。angular 2 のテストに関するより多くの投稿でブログを埋めていきます。

http://www.blog.wishtack.com/#!AngularJS-vs-Angular-2-Should-I-Stay-or-Should-I-Go/cuhk/573b59710cf233ef713771b2

それが役に立てば幸い

于 2016-05-21T11:33:20.217 に答える