在 Angular .config 中模拟 $window 对象

Mocking $window object inside Angular .config

我在尝试 运行 我的应用程序中的业力测试规范时遇到以下错误。

        Error: [$injector:modulerr] Failed to instantiate module adf.widget.tabularWidget due to:
        Error: Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
            at Error (native)
            at C:/Users/dell%20pc/Documents/Work/Client/widgets/TabularWidget/src/ta
bularWidget.js:22:43
            at Object.invoke (C:/Users/dell%20pc/Documents/Work/Client/bower_compone...

这里的问题是,当我 运行 测试时,它无法模拟 window 属性。以下是发生此问题的文件..

'use strict';
(function (windows, angular, $, _) {

    angular.module('adf.widget.tabularWidget')
        .config(function (dashboardProvider) {

            //more code

            //issue line
            var widgetDefsApiUrl = window.atob(window.api) +
                "Widget/definitions?access_token=" + window.atob(window.acstkn);

        });

})(window, angular, $, _);

但是当我只是注释掉那一行时,每个测试用例运行都没有问题。因此,如果我能以某种方式模拟 widgetDefsApiUrl 并将其注入我的测试用例,我的问题就会得到解决。但我不知道该怎么做。谁能给我指明正确的方向?

编辑: 我已经隔离了问题。问题是 window.api 在这里未定义,因此 window.atob() 给出了错误。我将如何克服这个问题?

找到解决方案。只需要在 beforeEach 块中模拟 window 对象。

beforeEach(function() {
        var window = {};
        window.api = "windowsapitoken";
        window.acstkn = "windowsacsapitoken";

)};

您可以直接获取 window 对象并将属性和方法附加到它上面。

beforeEach(function() {
        window.api = function() {};
        window.atob = function() {};
)};