Жасмин не распознает мои (глобальные) функции

Впервые использую Жасмин, но все еще пытаюсь разобраться в происходящем. Использование автономной версии 2.0.0. В моем SpecRunner.html есть следующие строки:

//... jasmine js files included here ...
<!-- include source files here... -->
<script type="text/javascript" src="lib/jasmine-jquery.1.3.1.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="src/admin.js"></script>
//... the rest of my scripts, and then my specs ...

Поэтому я обязательно включаю свой файл admin.js, в котором объявляю следующий набор функций:

$(function() {
    function deleteLink(linkHref, callback) {
        $.ajax({
            type: "POST",
            url: "/delete?href=" + linkHref,
            success: callback
        });
    }

    function redirectHome() {
        location.assign("/");
    }

    $('.delete_button').on('click', function() {
        var buttonUrl = $(this).parent().data('link-href');
        if( confirm("Are you sure you want to remove this link?") ) {
            deleteLink(buttonUrl, redirectHome);
        }
    });
});

Я пытаюсь протестировать эту функциональность (которая работает в браузере именно так, как я ожидал) с помощью рекомендуемый формат для тестирования обратных вызовов AJAX:

describe("Admin library", function() {
    describe(".delete_button event handling", function() {
        beforeEach(function() {
            loadFixtures("delete_button.html");
        });

        // other tests here...

        it("should set the location to /", function() {
            spyOn($, "ajax").and.callFake(function(e) {
                e.success();
            });
            var callback = jasmine.createSpy();
            deleteLink("http://some.link.href.com", callback);
            expect(callback).toHaveBeenCalled();
        });
    });
});

Однако тест всегда терпит неудачу с этой ошибкой:

Can't find variable: deleteLink in file:///path/to/my/app/jasmine/spec/adminSpec.js

В настоящее время я тестирую функции в других файлах jasmine / spec, которые явно не объявлены в этих файлах. Я думал, что в этом смысл включения скриптов в файл SpecRunner.html, верно? Есть идеи относительно того, что здесь происходит?


person Brad Rice    schedule 07.01.2014    source источник


Ответы (1)


Функция deleteLink не является глобальной. Он объявлен внутри закрытия (в вашем случае это функция самовызова). Если вы хотите, чтобы эта функция была глобальной, вам нужно добавить это в файл "admin.js" внутри закрытия:

window.deleteLink = deleteLink;
person HoLyVieR    schedule 07.01.2014
comment
Чувак, ты классный. У меня все еще есть проблемы с закрытием, поэтому я был полностью обманут этой ошибкой. Не могли бы помочь мне в правильном направлении, если это правильный способ справляться с подобными ситуациями? Или цель разработчика javascript - избежать создания этих глобальных функций? Я не мог придумать полезный объект JS для создания экземпляра, которому я мог бы назначить эту функцию, поэтому я выбрал самый простой вариант, который я видел ... - person Brad Rice; 08.01.2014
comment
@BradRice Если метод нужно использовать где-то еще, он должен быть общедоступным. Чего вы хотите избежать, так это иметь глобальную переменную или функцию, к которой не должны обращаться другие файлы. Кроме того, если ваш проект становится больше, вы можете использовать пространство имен для этих функций в объекте, например window.MyNamespace = {} и window.MyNamespace.MyFunction = .... - person HoLyVieR; 08.01.2014
comment
Большое спасибо за Вашу помощь. Для всех, кто вроде меня, кто хотел немного больше информации о том, что делает методы и свойства общедоступными, а не частными или привилегированными, я нашел эту статью очень полезной: phrogz.net/JS/classes/OOPinJS.html - person Brad Rice; 08.01.2014