Angular 1.x在测试中模拟依赖项

时间:2017-03-22 22:15:20

标签: angularjs testing mocha karma-mocha

过去几天我看了SO和互联网,我无法弄清楚我错过了什么。 (Angular 1.4.7)

我正在处理的应用程序很大,每个控制器都有很多依赖关系;本地服务和第三方。我模拟了模块,并注入了依赖项。但是,我发现如果我还没有模拟那些依赖项注册的模块,我将得到“[$ injector:unpr]未知提供程序:”错误。更糟糕的是,这些依赖关系可能还有其他依赖关系,而现在我正在走向一个“angular.mock.module”的兔子洞 - 所有这些也是如此。如果我设法模拟所有模块,它就可以工作。

我确定这不正确,但没有博客文章,现有的规范文件或视频提到了类似的问题。我肯定错过了什么。无论我使用ngMock还是像BardJS这样的帮手,都会发生这种情况。

我理解模拟服务的概念,但我认为这并不适用于此。我不会潜入角度ui bootstrap并开始逐个嘲笑一切。下面的测试按原样运行。如果控制器中存在另一个依赖关系,例如“DataService”,我将不得不模拟其模块及其所有依赖模块。提前致谢!我知道这一定很简单。

describe("HomeController", function() {
        beforeEach(angular.mock.module("app.home"));
        beforeEach(angular.mock.module("app.notify"));
        beforeEach(angular.mock.module("ngDialog"));
        describe("controller", function() {
            var scope;
            var controller;
            var HomeController;
            beforeEach(inject(function($rootScope, _Notify_, _ngDialog_, $controller) {
                scope = $rootScope.$new();
                controller = $controller;
                HomeController = controller("HomeController", {
                    $scope: scope
                });
                Notify = _Notify_;
                ngDialog = _ngDialog_;
            }));
            it('should exist', function() {
                expect(HomeController).to.be.defined;
            })
        });

1 个答案:

答案 0 :(得分:1)

好的,我发现了我所缺少的东西。

我不需要单独模拟每个子模块,而是需要模拟整个顶级应用程序模块。

所以上面这个:

beforeEach(angular.mock.module("app.home"));
beforeEach(angular.mock.module("app.notify"));
beforeEach(angular.mock.module("ngDialog"));

变为:

beforeEach(angular.mock.module("app"));

谢谢我!