注入用于运行结束测试的AngularJs服务

注入用于运行结束测试的AngularJs服务,angularjs,unit-testing,karma-runner,Angularjs,Unit Testing,Karma Runner,我正在尝试测试一个名为MyService的angularjs服务。如果我尝试注入它,似乎angular在加载之前尝试使用它。另一方面,如果我通过$provide等方式模拟MyService,它会工作,但我不会有实际的对象进行测试 (function (angular) { 'use strict'; angular.module('app', []).run(["MyService", function (MyService) {

我正在尝试测试一个名为MyService的angularjs服务。如果我尝试注入它,似乎angular在加载之前尝试使用它。另一方面,如果我通过
$provide
等方式模拟MyService,它会工作,但我不会有实际的对象进行测试

(function (angular) {
    'use strict';

    angular.module('app', []).run(["MyService",
            function (MyService) {

                MyService.initListeners();


             }
        ]);

    // this is supposed to be in another file
    angular.module('app')
        .service("MyService", function() {

                return {
                     initListeners: function() {
                       console.log("working")
                     }
                }
        })

}(angular));
测试是这样的:

(function () {
    'use strict';

    describe("MyService", function () {

        var MyService = null;

        beforeEach(module("app"));

        beforeEach(inject(function ($injector) {
            MyService = $injector.get('MyService');
        }));

        afterEach(function () {
            MyService = null;
        });

        it("injection works", function () {
            expect(true).toBeTruthy(); // throws exception
        });

    });
}());

我在JSFIDLE上做了测试

我看到了一些控制台消息的执行顺序。正如预期的那样,执行顺序是正确的

My service constructor
before init
MyService.initListeners()
after init
这两个测试工作正常:

    it("injection works", function () {
        expect(true).toBeTruthy(); // throws exception
        expect(MyService).toBeDefined();
    });
代码如下:


它可能是您的AngularJS版本、Jasmine等。

您的问题是如何获得真正的MyService对象?是的,我想测试MyService,但我无法测试,因为它是在运行时注入的,所以angular会在加载之前查找它。您应该在每个(模块('app',函数($provide){$provide.factory)之前这样做('MyService','LINK TO CONSTRUCTOR IF it IN CONSTRUCTOR');};@NarekMamikonyan你到底是什么意思?你能把它作为响应发布吗?你能显示你的服务代码吗?