Модульное тестирование в angular с использованием IIFE выдает эталонную ошибку?

В настоящее время я работаю над написанием простого тестового примера для сценария драйвера с использованием IIFE (немедленно вызываемое функциональное выражение). Вот мой скрипт драйвера.

driver.js

(function() {
"use strict";

var app = angular
    .module("myApp", [
        "ui.bootstrap",
        "ui.sortable"
    ]);
}());

Вот моя спецификация driver.spec.js

describe("application configuration tool driver", function() {
 it("should create an angular module named myTest", function() {
    expect(app).toEqual(angular.module("myApp"));
 });
});

Когда я запускаю свою спецификацию с помощью IIFE. Я получаю ReferenceError: приложение не определено.

Если я запускаю скрипт драйвера без IIFE:

var app = angular
    .module("myApp", [
        "ui.bootstrap",
        "ui.sortable"
    ]);

Моя спецификация проходит. Любые мысли о прохождении спецификации с использованием IIFE?


person Teja    schedule 20.10.2015    source источник
comment
переменная app является локальной для IIFE, но тест expect(app).toEqual(angular.module("myApp")); для меня не имеет смысла.   -  person PSL    schedule 20.10.2015
comment
зачем вообще нужна переменная app?   -  person charlietfl    schedule 20.10.2015
comment
Я использовал переменную app для создания пользовательских директив и контроллеров.   -  person Teja    schedule 20.10.2015
comment
@charlietfl несколько плохо написанных примеров использования angular show var app в сочетании с app.controller ..., app.factory ..., и, к сожалению, люди не знают, что это анти-шаблон.   -  person Claies    schedule 20.10.2015
comment
@Claies Я недавно читал об этом, но я хотел, чтобы все мои контроллеры и директивы были заключены в IIFE. Поэтому для краткой демонстрации я использовал переменную app.   -  person Teja    schedule 20.10.2015
comment
@Teja, к тому, о чем я говорил в другом комментарии, лучше использовать геттер модуля angular.module("myApp").controller ..., чем прикреплять модуль к переменной. Пока вы не используете сеттер (angular.module("myApp",[...])...) более одного раза, вам не нужен var app. Геттер всегда будет возвращать один и тот же экземпляр вашего модуля.   -  person Claies    schedule 20.10.2015
comment
в дополнение к моей точке зрения, я только что ответил на вопрос, который иллюстрирует то, что я имею в виду: не работает"> stackoverflow.com/questions/33246645/angular-filter-not-working/   -  person Claies    schedule 21.10.2015
comment
@Claies Я понял твою точку зрения. Я следовал руководству по стилю от johnpapa(github.com/johnpapa/angular-styleguide) где он использует способ angular,module("myApp") ....   -  person Teja    schedule 21.10.2015
comment
правильно, если использовать этот стиль, то приложение не нужно, так что это больше не вопрос, требующий ответа?   -  person Claies    schedule 21.10.2015
comment
@Claies Мне было интересно, как проверить переменные, область действия которых находится внутри IIFE?   -  person Teja    schedule 21.10.2015
comment
как было упомянуто в предоставленном ответе, вы действительно не можете, если вы не можете выставить переменную вне IIFE. если бы вы могли тестировать переменные с внутренней областью видимости, вы бы в первую очередь лишили законной силы цель IIFE.   -  person Claies    schedule 21.10.2015
comment
@Claies О, понял. Спасибо за разъяснение.   -  person Teja    schedule 21.10.2015


Ответы (1)


Вы можете переместить app обратно во внешнюю область (если это вариант, который вы можете использовать, конечно):

var app;
(function(app) {
    "use strict";

    app = angular
        .module("myApp", [
            "ui.bootstrap",
            "ui.sortable"
        ]);
}(app));
person taxicala    schedule 20.10.2015