2014-01-24 5 views
2

Следующий код в $ timeout никогда не вызывается. Я могу поставить любой неправильный тест мне нравится там и тест всегда проходит (есть подобный вопрос (Karma e2e testing: how to know when the DOM is ready?), но он не обеспечивает решения):Karma angularjs тестирование: тестовый код в тайм-ауте никогда не выполняется

it('should display a filter row when attribute sg-live-filtering is present', function() 
{ 
    angular.mock.inject(function($compile, $rootScope, $timeout) { 
     var elem = $compile('<div sg-grid sg-data="api/grid/accounts" sg-live-filtering></div>')(scope); // the angular-kendo grid 
     $rootScope.$apply();    
     var table = elem.find('table[role="grid"]'); // find the kendo grid 
     expect(table.length).toBe(1); 
     var header = table.find('thead'); // find the grid's table header 
     expect(header.length).toBe(1); 
     $timeout(function() { 
     // get the second row in the header and check it has a specific class 
     expect(header.find('tr').eq(1).hasClass('sg-grid-filter-row')).toBeTruthy(); 
     // e.g. I could do this and it would still pass!!!    
     expect(header.find('tr').eq(500)); 
     }); 
    } 
} 

PhantomJS 1.9.2 (Windows 7): Выполненная 1 из 871 (пропущено 383) УСПЕХ (0 секунд/0

Это то, что он выглядит в браузере:

enter image description here

кендо сетка создается с помощью STANDAR d angularjs директива:

angular.module('sgComponents').directive('sgGrid', [ 
    templateUrl: 'sg-grid.html', 
    // lots of kendo code follows to build the grid  
]); 

Внешний шаблон SG-grid.html:

<div sg-grid sg-data="api/grid/accounts"    
    sg-live-filtering> <!-- the attribute I want to test -->   
</div> 

При выполнении кода директивы, есть проверка, чтобы увидеть, если SG-живой фильтрации атр присутствует. Если да, то утилита функция вызывается добавить строку, которую вы видите выделены в изображении таблицы заголовок сетки в:

if (attrs.sgLiveFiltering) { 
    /* 
    timeout is needed to ensure DOM is ready. COULD THIS BE THE PROBLEM? 
    */ 
    $timeout(function() { 
     /* 
     this function adds the filter row to the grid. 
     THE NEW ROW HAS CLASS 'sg-grid-filter-row' THAT I USE FOR TESTING 
     */ 
     buildGridFilterRow(elm, scope, attrs); 
    }); 
} 
+2

Вы пробовали что-то вроде '$ timeout.flush (100)' для имитации прошедшего времени? – idursun

+0

Куда бы я это сказал? После или до блокировки таймаута? – Tone

+1

в любом месте после '' компиляции'', а также вам не нужен блок '$ timeout', вы должны иметь возможность утверждать напрямую. – idursun

ответ

2

Вы можете отобразить тестовый код ??? Потому что вам нужно подождать, чтобы выполнить тайм-аут или просто использовать $ timeout.flush(); Вот пример: Unit testing an asynchronous service in angularjs

+0

Вы можете увидеть мой тестовый код в первом сером блоке по этому вопросу (он (должен ...). $ Timeout.flush() был рекомендован idursun выше, но я не могу заставьте его работать. Спасибо за ссылку, я прочитаю об этом. – Tone

+0

Используйте прогоны и ожидания. Для методов из жасмина, чтобы дождаться, когда этот код выполнит – igorzg

+0

ok Спасибо, я попробую те – Tone

2

И наконец (через 2 недели!) Это заработало. @idursun и igorzg были правильными, когда они предложили использовать $ timeout.flush (100), но это также необходимо, так как @idursun далее упомянул в своих комментариях, что блок timeout также будет удален.

Когда я изначально пробовал это, он не работал, но теперь он это делает. Не спрашивайте меня, почему мне все равно, что он работает! Вот мой полный тестовый пример:

it('should display a filter row when attribute sg-live-filtering is present', function() { 
    angular.mock.inject(function($compile, $rootScope, $timeout) { 
    var scope = $rootScope.$new(); 
    scope.accountColumnsForAdvSearch = [ 
     {field: 'accountId', title: 'AccountId', dataType: 'string'}, 
     {field: 'name', title: 'Account Name', dataType: 'string'}, 
     {field: 'shortName', title: 'Short Name', dataType: 'string'}, 
     {field: 'status', title: 'Status', dataType: 'string'} 
    ]; 

    $httpBackend.when('GET', 'api/grid/accounts').respond(accountData);  

    var elem = $compile('<div sg-grid sg-data="api/grid/accounts" sg-columns="accountColumnsForAdvSearch" sg-live-filtering="true"></div>')(scope); 
    $rootScope.$apply(); 
    $httpBackend.flush(); 
    $timeout.flush(100); // wait for DOM to load 
    var table = elem.find('table[role="grid"]'); // the kendo grid 
    expect(table.length).toBe(1); 
    var filterRow = table.find('.sg-grid-filter-row'); // the filter row 
    expect(filterRow.length).toBe(1); 
}); 
+0

Что вы используете для sg-grid? Есть ли что-то другое, кроме http://kendo-labs.github.io/angular-kendo? –

+0

@WayneBrantley - только что просмотрел ваш комментарий sg-grid - сетка кендо, просто у нас есть наша собственная директива, называемая sgGrid, которая затем отвечает за создание сетки кендо. – Tone