在使用打字稿的茉莉花测试中注入 $http 失败

Injecting $http fails in jasmine testing with typescript

我们正在用 Typescript 开发一个测试驱动的程序。 这是我们对茉莉花的测试:

import IDifferentialPilotService = DifferentialPilot.IDifferentialPilotService;
import Ev3DifferentialPilotService = DifferentialPilot.Ev3DifferentialPilotService;
import IHttpService = ng.IHttpService;

describe("restClientService integration test: ", function () {

    // sut
    var ev3DifferentialPilotService: IDifferentialPilotService;

    //doc
    var http: IHttpService;

    beforeAll(function () {
        angular.mock.inject(function ($http: IHttpService) {
            this.http = $http;
        });
        ev3DifferentialPilotService = new Ev3DifferentialPilotService(http);
    });

    it("robot should run 5 m", function () {
expect(ev3DifferentialPilotService.runDistance(5)).toBe("success");

    });

}); 

测试的classEv3DifferentialPilotService是这样的:

namespace DifferentialPilot {
    "use strict";

    import IHttpService = ng.IHttpService;

    export class Ev3DifferentialPilotService implements IDifferentialPilotService {
        private http: IHttpService;

        static $inject = ['$http'];
        constructor($http: IHttpService) {
            this.http = $http;
        }

        public runDistance(runDistance: number): string {
            this.http({
                method: "POST",
                url: "10.0.0.44:8080/differentpilot/run/5"
            }).then(function successCallback(response: any) {
                return "success";
            }, function errorCallback(response: any) {
                return "error";
            });

            return undefined;
        }
    }
} 

如您所见,我们想在测试中注入 $http-服务,以便 Ev3DifferentialPilotService 可以检索 Http-服务作为参数并在其 runDistance-方法。 当我们在 Ev3DifferentialPilotService 中记录 this.$http-Object 时,我们得到 undefined,这意味着注入失败。据此测试也失败了。

我正在将 Ev3DifferentialPilotService 注册为 App.js 中的服务:

var app = angular.module("AngularDifferentialPilotModule", []);
app.service("ev3DifferentialPilotService", DifferentialPilot.Ev3DifferentialPilotService); 

我们在 karam.conf.js:

中使用了所有这些东西
// Karma configuration
// Generated on Thu Dec 17 2015 14:02:38 GMT+0100 (Mitteleuropäische Zeit)

module.exports = function (config) {
    config.set({

        // base path that will be used to resolve all patterns (eg. files, exclude)
        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: [
            "bower_components/angular/angular.js",
            "bower_components/angular-mocks/angular-mocks.js",
            "src/Ev3DifferentialPilotService.js",
            "spec/*.spec.js",
            "src/app.js"
        ],

        // list of files to exclude
        exclude: [],


        // preprocess matching files before serving them to the browser
        // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
        preprocessors: {},


        // test results reporter to use
        // possible values: 'dots', 'progress'
        // available reporters: https://npmjs.org/browse/keyword/karma-reporter
        reporters: ['progress'],


        // web server port
        port: 9876,


        // enable / disable colors in the output (reporters and logs)
        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,


        // enable / disable watching file and executing tests whenever any file changes
        autoWatch: false,


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


        // Continuous Integration mode
        // if true, Karma captures browsers, runs the tests and exits
        singleRun: false,

        // Concurrency level
        // how many browser should be started simultanous
        concurrency: Infinity
    })
}

此外,我们正在使用如下所示的 tsconfig:

{
  "compilerOptions": {
    "module": "commonjs",
    "noImplicitAny": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "sourceMap": true
  } 

那么错误在哪里呢?有人可以帮助我吗?

您不能在 beforeAll (https://github.com/angular/angular.js/issues/10238)

中注入

已打开一个功能(https://github.com/angular/angular.js/pull/14093)但尚未合并。