Angular 2 - почему ng test игнорирует ошибку компиляции TS?

я создаю некоторую ошибку TS в моем тесте (файл спецификации), например: let num: number = "dsds".

  • Я провожу тест ng, и тест прошел успешно ... почему?
  • я ожидал получить некоторую ошибку TS в терминале
  • Что мне нужно сделать, чтобы включить это поведение (ошибка перехвата TS) при запуске тестов?
  • Details:
    • @angular/cli: 1.0.0-beta.31
    • узел: 6.9.2
    • ОС: win32 x64
    • @ угловой / общий: 2.4.7
    • @ angular / компилятор: 2.4.7
    • @ angular / core: 2.4.7
    • @ angular / forms: 2.4.7
    • @ angular / http: 2.4.7
    • @ angular / платформенный браузер: 2.4.7
    • @ угловой / платформа-браузер-динамический: 2.4.7
    • @ angular / маршрутизатор: 3.4.7
    • @ angular / cli: 1.0.0-beta.31
    • @ угловой / компилятор-cli: 2.4.7

person Chen Reuven    schedule 12.02.2017    source источник
comment
Вы можете показать нам свой тестовый код?   -  person MChaker    schedule 12.02.2017
comment
конечно, но действительно очевидный, потому что он связан с ошибкой компиляции TS. it('should create the app', async(() => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.debugElement.componentInstance; let num: number = "dsds"; expect(app).toBeTruthy(); }));   -  person Chen Reuven    schedule 12.02.2017


Ответы (1)


Если вы хотите, чтобы ng test поймал его при компиляции, вам нужно написать отдельный тестовый пример для этого элемента. Вы можете использовать, например, RegExp, чтобы проверить, является это числом или нет.

it('should be a number', () => {
  expect(component.num).toMatch(/\d+/);
});


Изменить:

Если вы объявите следующую переменную:

someNumberVar: number = "thisIsNotANumber";

TypeScript обнаружит это как ошибку, но при компиляции приложения, а не при тестировании! Вы можете проверить это самостоятельно, установить эту переменную и начать компиляцию, набрав ng serve в консоли. Вы получите следующую ошибку:

Type 'string' is not assignable to type 'number'.

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

person kind user    schedule 12.02.2017
comment
мм, но почему? Это ошибка компиляции TS, а не логическая ошибка или исключение времени выполнения. - person Chen Reuven; 12.02.2017
comment
@ user2415300 Отредактировал мой пост. - person kind user; 12.02.2017
comment
Итак, что вы говорите, так это то, что ошибка компиляции сценария типа НЕ будет обнаружена при запуске тестирования, только при сборке / запуске приложения? - person Chen Reuven; 13.02.2017
comment
@ user2415300 Если вы не сделаете для него тестовый пример - нет. - person kind user; 13.02.2017
comment
Все зависит от того, чего вы ожидаете, похоже, что num может быть строкой, содержащей только числовые значения. В этом случае вы должны использовать string в качестве типа. Если это может быть строка или число, используйте тип string | number и так далее. Другими словами, тип должен отражать область значений, которые вы ожидаете от него во время выполнения. - person Aluan Haddad; 17.02.2017
comment
@ user2415300, спасибо за ответ, - person Chen Reuven; 18.02.2017
comment
@AluanHaddad, ты не понял, мой вопрос: почему тест ng игнорирует ошибку компиляции TS? - person Chen Reuven; 18.02.2017
comment
Я понял это. Я просто подумал, что это уже объяснили другие. Если вы не тестируете файл объявления, тесты всегда проверяют поведение во время выполнения, которое они запускают после компиляции. Вы можете запретить машинописному тексту выдавать код, если есть ошибка компиляции с флагом --noEmitOnError. В противном случае вы тестируете компилятор, а не свой код. Это просто общий принцип работы статически типизированных языков, и это имеет большой смысл. Например, если вы используете ts-node для запуска своих тестов, вы фактически получите сбой при запуске своей тестовой команды, но это произойдет из-за компиляции - person Aluan Haddad; 18.02.2017