@types/2.5.46
, и у меня возникли проблемы.Definitions by:
в index.d.ts
), чтобы они могли ответить .В 2.5.45 я смог сделать что-то вроде этого:
expect(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
Теперь это дает мне ошибку
TS2345:Argument of type '"myValue"' is not assignable to parameter of type 'Expected<Promise<string>>'.
Он перестанет жаловаться, если я добавлю .toString после getAttribute, но я не уверен, что это сработает.
Да, это большая проблема для любого, кто использует транспортир в TypeScript.
Кажется, что Jasmine (или, возможно, версия Jasmine от Protractor, если она ее изменяет - я не уверен?) Поддерживает ожидание обещания, а затем тестирование разрешенного значения обещания, при этом автору теста не нужно разрешать обещание самостоятельно.
Похоже, что @ lukas-zech-software сделал совпадения универсальными, что действительно круто, но нарушает передачу обещаний и сопоставление с их разрешенными значениями.
Как уже упоминалось в комментариях PR, это ничего не может поделать типаж с жасмином.
Protractor расширяет функциональность, поэтому он должен предоставлять для этого типизацию.
Если бы для транспортира на DefinuneTyped были какие-либо типизации, это произошло бы во время тестов, но их нет, поэтому я не могу исправить это здесь.
На самом деле Protractor вообще не предоставляет никаких типизаций для этого, поэтому они просто полагаются на expect
принимающее any
качестве параметра.
Я с трудом могу добавить набор текста для асинхронного expect
который не будет работать в самом жасмине.
Пожалуйста, откройте проблему с транспортиром и попросите их правильно расширить набор текста жасмина.
Пока это не будет исправлено, есть несколько обходных путей:
Исправьте версию типизаций до 2.5.45
Это просто будет использовать последнюю рабочую версию.
Исправление версии типизации, похоже, в любом случае становится Лучшей практикой, поскольку типизация не может следовать за SemVer, а изменения в дополнительной версии могут легко сломать вашу сборку.
См. Эти вопросы:
https://github.com/DefinitiTyped/DefinitiTyped/issues/14579
https://github.com/DefinitiTyped/DefinitiTyped/issues/14569
https://github.com/DefinitiTyped/DefinitiTyped/issues/14338
https://github.com/DefinitiTyped/DefinitiTyped/pull/13994#issuecomment -275949045
Используйте any
качестве универсального параметра для expect
Новые типы ввода по-прежнему позволяют вам иметь старое поведение, вам просто нужно явно указать, что вы хотите использовать any
как тип, подобный этому
expect<any>(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
expect
и добавьте ее в свой проект. // UNTESTED CODE!
interface AsyncMatchers<T> extends Matchers<Promise<T>> {
toBe(expected: Expected<T>, expectationFailOutput?: any): boolean;
toEqual(expected: Expected<T>, expectationFailOutput?: any): boolean;
toContain(expected: T, expectationFailOutput?: any): boolean;
not: AsyncMatchers<T>;
}
Добавьте этот код в protractor.d.ts
в свой проект где-нибудь, чтобы компилятор TypeScript мог его видеть, и он должен решить ваши проблемы, учитывая, что обещание в expect
фактически разрешается в тип, указанный в toEqual
Круто, спасибо за разъяснение @ lukas-zech-software. Оцените разные решения. Я закончил тем, что на данный момент заблокировал набор текста для более ранней версии.
Предлагаю это можно закрыть.
Использование async / await для «разыменования» обещания работает.
Например, вместо
it('should have header', () => {
let subject = element(by.css('h1')).isPresent();
let result = true;
expect(subject).toEqual(result);
});
иметь это как
it('should have header', async () => {
let subject = await element(by.css('h1')).isPresent();
let result = true;
expect(subject).toEqual(result);
});
ожидать(
к
ожидать
это сработало для меня
Установка @types/jasminewd
работает для меня, по ссылке
beforeEach (() => {
страница = новый xxx ();
browser.waitForAngularEnabled (ложь);
});
это решит проблему
Для меня сработала корректировка tsconfig.e2e.json
за этот комментарий. Моя проблема появилась при обновлении с Angular 4 до 5 в проекте, управляемом CLI.
https://github.com/angular/protractor/issues/4176#issuecomment -310610380
Если вы можете жить с неточностью, другой обходной путь, похоже, отбрасывает toEqual со строкой и вместо этого запрашивает toContain.
установка @types/jasminewd2
решила проблему для меня
Для меня сработала корректировка
tsconfig.e2e.json
за этот комментарий. Моя проблема появилась при обновлении с Angular 4 до 5 в проекте, управляемом CLI.
угловой / транспортир # 4176 (комментарий)
Правильный ответ - установка @types/jasminewd2
.
Обратите внимание, установка @types/jasminewd2
__ НЕ __ является правильным ответом:
jasminewd2
не обязательно совместим с типами jasmine для v3, поскольку он нацелен на jasmine v2.any
-d все входы.Правильный ответ:
expectAsync
доступные в последней версии жасмина.
Самый полезный комментарий
Пока это не будет исправлено, есть несколько обходных путей:
Исправьте версию типизаций до 2.5.45
Это просто будет использовать последнюю рабочую версию.
Исправление версии типизации, похоже, в любом случае становится Лучшей практикой, поскольку типизация не может следовать за SemVer, а изменения в дополнительной версии могут легко сломать вашу сборку.
См. Эти вопросы:
https://github.com/DefinitiTyped/DefinitiTyped/issues/14579
https://github.com/DefinitiTyped/DefinitiTyped/issues/14569
https://github.com/DefinitiTyped/DefinitiTyped/issues/14338
https://github.com/DefinitiTyped/DefinitiTyped/pull/13994#issuecomment -275949045
Используйте
any
качестве универсального параметра дляexpect
Новые типы ввода по-прежнему позволяют вам иметь старое поведение, вам просто нужно явно указать, что вы хотите использовать
any
как тип, подобный этомуexpect
и добавьте ее в свой проект.Это было бы лучшим решением, но его должен делать транспортир.
Вероятно, это будет выглядеть примерно так
Добавьте этот код в
protractor.d.ts
в свой проект где-нибудь, чтобы компилятор TypeScript мог его видеть, и он должен решить ваши проблемы, учитывая, что обещание вexpect
фактически разрешается в тип, указанный вtoEqual