2016-09-20 6 views
9

Я работаю с набором тестов Jasmine, который включает в себя как «ванильные» тесты Жасмина, так и тесты Жасмина для некоторых компонентов Angular 2. Из-за включения Angular 2 загружается zone.js. Это создает конфликт с часами Жасмина. Например, следующий тест завершается с ошибкой, Error: Jasmine Clock was unable to install over custom global timer functions. Is the clock already installed?Конфликт между zone.js и часами Жасмина

describe('an async test with zone.js present', function() { 
    beforeEach(function() { 
    jasmine.clock().install(); 
    }); 

    afterEach(function() { 
    jasmine.clock().uninstall(); 
    }); 

    it('cannot install jasmine\'s mock clock', function() { 
    var callback = jasmine.createSpy('setTimeoutCallback') 
    setTimeout(callback, 55); 
    jasmine.clock().tick(56); 
    expect(callback).toHaveBeenCalled(); 
    }); 
}) 

Here является plunker для приведенного выше кода.

Не доставляя испытания на Угловые 2 отдельно от тестов «ванили», мне интересно, какие варианты могут быть доступны. Например, можно ли выполнить работу часов Jasmine с зоной? Например, можно ли имитировать тик в зоне или сбросить все запланированные задачи до утверждения?

ответ

4

Для меня это работает, если вы удалите часы в beforeEach. Его не рекомендуется жасмином и немного странно, потому что для удаления имеет смысл использовать afterEach. Но вызов uninstallдо первый звонок install происходит для меня.

+0

Это также, кажется, исправляет проблему для меня, но я не уверен, что это может вызвать, потому что теперь функции ZoneJS больше не вызываются. –

+0

Выполняете ли вы 'деинсталляцию', а затем' install' или только удаление? – Tim

+0

обе, сначала удалите и затем установите. AFAIK для деинсталляции сбросит все функции часов, установленные в настоящее время на реальные часы, тогда установка всегда будет работать, потому что проверка, которая вызывает исключение в первую очередь, теперь всегда будет проходить из-за удаления. Он работает для меня сейчас, но это может вызвать проблемы, если я запустил тест, для которого требуется ZoneJS. –

4

Как указано на Angular documentation, вы должны использовать функцию tick в корпусе fakeAsync, который является частью модуля @angular/core/testing.

Используя ваш пример и машинопись, это будет выглядеть примерно так ...

import { fakeAsync, tick } from '@angular/core/testing'; 

... 

it('cannot install jasmine\'s mock clock', fakeAsync(() => { 
    var callback = jasmine.createSpy('setTimeoutCallback') 
    setTimeout(callback, 55); 
    tick(56); 
    expect(callback).toHaveBeenCalled(); 
})); 
+3

Я делаю это для асинхронных тестов, но в некоторых тестах я просто хочу использовать 'jasmine.clock(). MockDate()' для mock 'Date'. Не могу сделать это с помощью 'fakeAsync()' – Necros

+1

Я столкнулся с той же проблемой. Могли ли вы найти способ правильно определить даты в Angular2? – Goutham

3

Код, который бросает это here.

Это означает, что жасмин был загружен до Zone.js. Переключите порядок загрузки. Зона всегда должна быть загружена первой.

+3

Для справки. Чтобы заставить его работать с Karma 1.3 и Jasmine 2.5, нам пришлось прибегнуть к переопределению 'customContextFile' в конфигурации. Мы вставляем 'zone.js',' long-stack-trace-zone.js' и 'proxy.js' из пакета zone.js перед включением jasmine lib. Кроме того, глобальный блок 'afterEach' с' jasmine.clock() .deinstall() ', казалось, решил проблемы для использования. – RJo