2014-08-28 2 views
2

Моя директива отлично работает в браузере. Это всего лишь единичный тест, который я не могу заставить работать. Директива создает простой слайдер и устанавливает несколько значений в области, включая min.Элемент с директивой не компилируется правильно в модульном тесте

В модульном тесте $ compile (element), похоже, просто завертывает его в jqlite, не делая ничего с ним. Ну, это также дает ему видимость, но в сфере видимости ничего нет. Шаблон также не применялся.

Мой блок тест:

describe('Given the slider directive', function() { 

beforeEach(function() { 
    module('app'); 
}); 

beforeEach(inject(function($httpBackend){ 
    // necessary because .whenGET().passThrough() doesn't seem to work 
    $httpBackend.whenGET('partials/slider.html').respond('<div class="slider horizontal">'+ 
     '<div class="min">{{min}}</div>'+ 
     '<div class="max">{{max}}</div>'+ 
     '<a slider-handle class="handle" ng-class="{focus: focus}"'+ 
     'role="slider"'+ 
     'aria-valuemin="{{min}}" aria-valuemax="{{max}}" aria-valuenow="{{slider.value}}" aria-labelledby="{{id}}-label" aria-controls="{{id}}-value"'+ 
     'tabindex="0"'+ 
     'ng-keydown="handleKeyDown($event)" ng-keypress="handleKeyPress($event)"'+ 
     'ng-focus="handleFocus($event)" ng-blur="handleBlur($event)"'+ 
     'ng-mousedown="handleMouseDown($event)"'+ 
     'ng-style="{\'left\': slider.left}"></a>'+ 
     '<div ng-style="{\'left\': slider.left}" ng-show="showVals" id="{{id}}-value" class="slider-value" role="presentation">{{slider.value}}</div>'+ 
    '</div>'); 
})); 

it('should compile and set the scope correctly', inject(function($compile, $rootScope) { 
    var element = $compile('<div slider min="6" max="18" step="1" ng-model="value"></div>')($rootScope); 
    $rootScope.$digest(); 

    var iScope = element.scope(); 

    iScope.$digest(); 

    console.log(iScope); 
    console.log(iScope.min); 
    console.log(element.html()); 
    console.log(element); 

    expect(element.html()).toContain("6"); 
    expect(element.find('div[class=min]').html()).toBe(6); 
    expect(iScope.min).toBe(6); 

})); 
}); 

Выход консоли этого:

Scope{$id: '00T', $$childTail: null, $$childHead: null, $$prevSibling: null, $$nextSibling: null, $$watchers: null, $parent: null, $$phase: null, $root: Scope{$id: '00T', $$childTail: null, $$childHead: null, $$prevSibling: null, $$nextSibling: null, $$watchers: null, $parent: null, $$phase: null, $root: Scope{$id: ..., $$childTail: ..., $$childHead: ..., $$prevSibling: ..., $$nextSibling: ..., $$watchers: ..., $parent: ..., $$phase: ..., $root: ..., this: ..., $$destroyed: ..., $$asyncQueue: ..., $$postDigestQueue: ..., $$listeners: ..., $$isolateBindings: ..., safeApply: ...}, this: Scope{$id: ..., $$childTail: ..., $$childHead: ..., $$prevSibling: ..., $$nextSibling: ..., $$watchers: ..., $parent: ..., $$phase: ..., $root: ..., this: ..., $$destroyed: ..., $$asyncQueue: ..., $$postDigestQueue: ..., $$listeners: ..., $$isolateBindings: ..., safeApply: ...}, $$destroyed: false, $$asyncQueue: [], $$postDigestQueue: [], $$listeners: Object{}, $$isolateBindings: Object{}, safeApply: function (a) { ... }}, this: Scope{$id: '00T', $$childTail: null, $$childHead: null, $$prevSibling: null, $$nextSibling: null, $$watchers: null, $parent: null, $$phase: null, $root: Scope{$id: ..., $$childTail: ..., $$childHead: ..., $$prevSibling: ..., $$nextSibling: ..., $$watchers: ..., $parent: ..., $$phase: ..., $root: ..., this: ..., $$destroyed: ..., $$asyncQueue: ..., $$postDigestQueue: ..., $$listeners: ..., $$isolateBindings: ..., safeApply: ...}, this: Scope{$id: ..., $$childTail: ..., $$childHead: ..., $$prevSibling: ..., $$nextSibling: ..., $$watchers: ..., $parent: ..., $$phase: ..., $root: ..., this: ..., $$destroyed: ..., $$asyncQueue: ..., $$postDigestQueue: ..., $$listeners: ..., $$isolateBindings: ..., safeApply: ...}, $$destroyed: false, $$asyncQueue: [], $$postDigestQueue: [], $$listeners: Object{}, $$isolateBindings: Object{}, safeApply: function (a) { ... }}, $$destroyed: false, $$asyncQueue: [], $$postDigestQueue: [], $$listeners: Object{}, $$isolateBindings: Object{}, safeApply: function (a) { ... }} 
undefined 
'' 
{0: <div slider="" min="6" max="18" step="1" ng-model="value" class="ng-scope"></div>, length: 1} 

У меня есть JSFiddle with the entire (slightly cleaned up) code, но он загадочно даже не пройти мимо $ компиляцией, это не та же проблема, что и у меня локально. Не уверен, что JSFiddle используется, потому что теперь у меня две загадочные проблемы, а не одна.

ответ

4

Месяцы отсутствия ответа или комментариев во время работы над другими материалами, и теперь я нашел ответ. Это очень просто:

$httpBackend.flush(); 

При использовании $httpBackend.whenGET() в модульном тесте, вам всегда нужно смывать. Поэтому, когда вы проверяете директиву с templateUrl, вам нужно сбросить() после компиляции $().

Надеюсь, это полезно кому-то там.

+0

Зачем нам делать флеш? – learner

+0

Поскольку GET не сразу возвращается. Он асинхронен и позволяет вам работать с ним в модульных тестах, вам нужно явно скрыться, когда вы хотите, чтобы вызов AJAX возвращался. Без него наивные линейные тесты были бы немного проще, но было бы невозможно проверить проблемы, вызванные асинхронностью, которую вы испытаете в процессе производства. – mcv

+0

Я подозреваю, что вам нужно «flush()» только потому, что вы используете «whenGET()» (чтобы получить HTML-код директивы), но не обязательно потому, что вы тестируете директиву с помощью шаблона url. В моем случае у меня есть все мои html-шаблоны, предварительно обработанные и хранящиеся в $ templateCache, поэтому «httpBackend.flush()« throws »Error: No pending request to flush!» –

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