2009-10-30 2 views
1

Просто быстрый вопрос ... В настоящее время у меня есть следующий код jQuery с селектором.Как выполнить модульный селектор jQuery?

var ID = "idControl" 
function doesTreeViewExist() 
{ 
    if($('#' + ID).length == 0) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 

Мне было интересно, как написать тест, чтобы проверить селектор, используя QUnit? В частности, у меня возникают проблемы с синтаксисом/кодом.

EDIT:

Хорошо, предположим, что теперь я хочу, чтобы дразнить вызов селектора вместо потому, что я не могу получить доступ к фактическому веб-сайт. Я использую JsTestDriver в качестве своего инструмента тестирования, а это значит, что я не могу прикоснуться к браузеру, в котором выполняются тесты (иначе тестовые прогоны прекратятся). Как насчет такой ситуации? Как я могу проверить код?

Спасибо.

ответ

3

Я использовал Джек и успешно издевался вызов Jquery и вернулся пользовательской длиной и ожидаемый результат.

Что-то вроде:

jack (function() { 
    jack.expect("$").exactly("1").withArguments("#" + ID).returnValue({length:0}); 
    doesTreeViewExist() 
    assertEquals(false, result); 
}); 

Я также сумел поставить структуру DOM, чтобы удовлетворить вызов JQuery, так как я использую один из встроенных функций HTMLDOC JsTestDriver в. Что-то вроде:

/*:DOC += <span id="idControl"></span> */ 

или просто создать DOM sturcture без указанного идентификатора, чтобы получить ложное заявление.

HTH.

9

Функция проводке, может быть сильно упрощена:

var ID = "idControl"; 
function doesTreeViewExist() { 
    return !!$('#' + ID).length; 
} 

Используя !! конструкцию (двойной побитовое НЕ), чтобы преобразовать length свойство Boolean, он будет возвращать false только тогда, когда длина равна нулю ,

Говоря о QUnit, вы можете легко настроить простой тест, как это:

test("Your selector test", function() { 
    ok($('#idControl').length > 0, "idControl exists"); 
    // or simply 
    ok($('#idControl').length, "idControl exists"); 
}); 

ok функция делает логическое утверждение, что эквивалентно assertTrue JUnit в.

3

Я тестирую селектора вручную, а затем передаю их в код, который их использует. Затем я смогу тестировать код, который их использует. Если вы хотите просто проверить селектор, вам нужен доступ к HTML, на который он влияет. Ваш тест может включать HTML целевой, что-то вроде:

test("selector works", function() { 
    var html = $('<input type="select"><option value=0/></input'); 

    var result = $('option', html); 

    ok(result.count() == 1); 
}); 

Но я не делаю этого ... Я положил селекторы на краю кода, так что я могу получить к ним быстро и пройти через них под отладчик. У меня будет простой класс, свойства которого - эти селекторы. Затем я буду обманывать/заглушить этот простой класс, поэтому я могу написать код для всего, что зависит от этих селекторов. Причина, по которой я не тестирую свои селекторы, заключается в том, что HTML-код, который они нацелены, генерируется кодом ASP.NET, и трудно получить от теста javascript. Но я могу обернуть их в Humble Object («http://xunitpatterns.com/Humble Object.html»), а затем проверить код, который зависит от этого скромного объекта. Вот простой класс обертки, что я могу заменить тест-двойники:

var createSelectWidget = function(rootSelector) 
{ 
    return { 
     userText : $('span', rootSelector), 
     inputList : $('option', rootSelector), 
    }; 
} 

Независимо от зависимостей схема впрыска вы используете, вы можете окурок его, как показано ниже. Предположу, что мой виджет отборного вход для чтения значения, и пролет я хочу написать некоторые результаты:

var createSelectWidgetStub = function() 
{ 
    return { 
     userText : { text = function() {}}, 
     inputList : { val = function() {}}, 
    }; 
} 

то я могу пройти вокруг этой заглушки в тестах, где я хочу, чтобы изолировать зависимость, но Дон» t заботиться о взаимодействии с этой зависимостью. Когда я хочу проверить взаимодействие с зависимостью, я могу высмеять это с помощью JSMock. Предположу, я хочу, чтобы проверить взаимодействие с входным списком, я бы подготовить окурок с одним элементом mock'd:

var selectMock = createSelectWidgetStub(); 
selectMock.inputList = mc.createMock(selectMock.inputList); 
+0

'' недействительно, вы должны использовать элемент '