Definitelytyped: Обещать<string>.toEqual не принимает строковый параметр. Требуется также Promise.</string>

Созданный на 16 мар. 2017  ·  13Комментарии  ·  Источник: DefinitelyTyped/DefinitelyTyped

  • [x] Я пробовал использовать пакет @types/2.5.46 , и у меня возникли проблемы.
  • [] Я пробовал использовать последнюю стабильную версию tsc. https://www.npmjs.com/package/typescript
  • [] У меня вопрос, который не подходит для StackOverflow . (Пожалуйста, задавайте там любые уместные вопросы).
  • [] [Упоминание] (https://github.com/blog/821-mention-somebody-they-re-notified) авторов (см. 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, но я не уверен, что это сработает.

Самый полезный комментарий

Пока это не будет исправлено, есть несколько обходных путей:

  1. Исправьте версию типизаций до 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

  2. Используйте any качестве универсального параметра для expect
    Новые типы ввода по-прежнему позволяют вам иметь старое поведение, вам просто нужно явно указать, что вы хотите использовать any как тип, подобный этому

expect<any>(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
  1. Напишите типизацию для функций async 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

Все 13 Комментарий

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

Кажется, что Jasmine (или, возможно, версия Jasmine от Protractor, если она ее изменяет - я не уверен?) Поддерживает ожидание обещания, а затем тестирование разрешенного значения обещания, при этом автору теста не нужно разрешать обещание самостоятельно.

Похоже, что @ lukas-zech-software сделал совпадения универсальными, что действительно круто, но нарушает передачу обещаний и сопоставление с их разрешенными значениями.

Как уже упоминалось в комментариях PR, это ничего не может поделать типаж с жасмином.

Protractor расширяет функциональность, поэтому он должен предоставлять для этого типизацию.
Если бы для транспортира на DefinuneTyped были какие-либо типизации, это произошло бы во время тестов, но их нет, поэтому я не могу исправить это здесь.
На самом деле Protractor вообще не предоставляет никаких типизаций для этого, поэтому они просто полагаются на expect принимающее any качестве параметра.

Я с трудом могу добавить набор текста для асинхронного expect который не будет работать в самом жасмине.
Пожалуйста, откройте проблему с транспортиром и попросите их правильно расширить набор текста жасмина.

Пока это не будет исправлено, есть несколько обходных путей:

  1. Исправьте версию типизаций до 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

  2. Используйте any качестве универсального параметра для expect
    Новые типы ввода по-прежнему позволяют вам иметь старое поведение, вам просто нужно явно указать, что вы хотите использовать any как тип, подобный этому

expect<any>(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
  1. Напишите типизацию для функций async 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 доступные в последней версии жасмина.
Была ли эта страница полезной?
0 / 5 - 0 рейтинги