注入$http在使用typescript的jasmine测试中失败

Injecting $http fails in jasmine testing with typescript

本文关键字:jasmine 测试 失败 typescript http 注入      更新时间:2023-09-26

我们正在开发一个用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");
    });
}); 

被测试的类Ev3DifferentialPilotService看起来像这样:

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-对象时,我们得到undefined,这意味着注入失败。据此,测试也失败了。

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

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)但尚未合并。