2017-02-07 7 views
1

Я использую Jasmine в своих тестах конца-2-конца, написанных с помощью транспортира. Я пытаюсь создать абстракцию объекта страницы, которая будет использоваться в качестве базового класса для других объектов страницы, определенных в моем решении.Jasmine async test issue

Как мое приложение представляет собой классическое решение на основе формы, поэтому я могу собрать общее поведение для редактирования страниц в базовый класс. Чтобы быть ближе к шаблону M **, я хочу связать свой абстрактный вид с конкретной моделью.

Так моя базовая страница вид объекта выглядит следующим образом:

export class EditPageBase<T> { 
    constructor(T model) { 
     this.model = model; 
    } 

    fillForm() { 
     ... 
    } 

    checkForm() { 
     ... 
    } 
} 

где Т - класс модели, связанные с этой точки зрения.

Этот подход позволяет мне использовать структуру модели и отображать непосредственно на мой взгляд. Поэтому любое свойство, определенное в модели, имеет соответствующее представление на мой взгляд.

Так что я могу использовать следующий синтаксис для отображения моей модели для просмотра:

for(let prop in this.model) { 
    let ctrl = this.getControl(prop); 
    ctrl.sendKeys(this.model[prop]); 
} 

Так не важно, насколько сложна моя форма - мне нужно только определить моя модель правильно.

Проблемы у меня возник с проверкой данных формы, как транспортир возвращает обещания при запросе данных страницы:

for(let prop in this.model) { 
    let ctrl = this.getControl(prop); 
    expect(ctrl.getAttribute('value')).toEqual(this.model[prop] || ''); 
} 

На этот раз кода времени бросает:

A Jasmine spec timed out. Resetting the WebDriver Control Flow.

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Я должен понять, почему это происходит - потому что мой цикл может закончиться раньше, что обещание решит. Я не знаю, как справиться с этой ситуацией. Я не хочу создавать цепочку обещаний или другие обертки Promise.all, так как Жасмин отлично работает с обещаниями, поэтому хочу оставить здесь код чистым.

Возможно, у кого-то были эти проблемы раньше, и вы можете поделиться некоторыми идеями о том, как использовать силу Жасмина здесь, не переключаясь на обещание ада.

ответ

0

Вы можете передать done обратного вызова метода it в жасмин, и в тесте, когда асинхронная работа сделана, вы можете вызвать эту done функцию сигнализировать жасмин, что ваш код асинхронной закончил, например:

it('does something', function(done) { 
    someAsyncMethod().then(function() { 
     expect(true).toEqual(true); 
     done(); // signal to Jasmine async operation is complete 
    } 
}); 

Смотрите Jasmine docs для получения дополнительной информации

+0

Спасибо за ответ. Да, я знаю о 'done', но это не то, что мне нужно. Проблема в том, что мне нужно ждать всех обещаний внутри цикла, а не заканчивать выполнение функции до этого. Жасмин отлично справляется с обещаниями даже без «сделанного» обратного вызова. – VadimB