2014-01-07 4 views
2

Первый раз, используя Жасмин, все еще пытаясь получить представление о вещах. Использование автономной версии 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); 
     } 
    }); 
}); 

Пожалуйста, простите грязный код. Я все еще изучаю навыки JS. Голые со мной. Я пытаюсь проверить эту функциональность (который работает в браузере именно так, как я ожидаю, что это) с suggested format для тестирования 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, правильно? Какие-нибудь идеи о том, что здесь происходит?

ответ

3

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

window.deleteLink = deleteLink; 
+0

Чувак, вы потрясающий. Я все еще получаю завесу закрытий, поэтому я был полностью обманут этой ошибкой. Разум помогает мне в правильном направлении, если это «правильный путь», чтобы справляться с такими ситуациями? Или цель разработчика javascript, чтобы избежать создания глобальных функций? Я не мог придумать полезный объект JS для создания экземпляра, к которому я мог бы назначить эту функцию, поэтому я пошел с самым простым вариантом, который я видел ... –

+0

@BradRice Если метод нужно использовать в другом месте, он должен быть общедоступным. Вы хотите избежать глобальной переменной или функции, к которой не должны обращаться другие файлы. Кроме того, если ваш проект становится больше, вы можете «использовать пространство имен» для этой функции в объекте, например 'window.MyNamespace = {}' и 'window.MyNamespace.MyFunction = ...'. – HoLyVieR

+0

Большое спасибо за помощь. Для таких, как я, кто хотел получить немного больше информации о том, что делает методы и свойства «общедоступными» и «частными» против «привилегированных», я нашел эту статью очень полезной: http://phrogz.net/JS/classes /OOPinJS.html –

Смежные вопросы