Итак, я пытаюсь начать работу с TypeScript, и у меня возникают некоторые проблемы при его установке в моей тестовой среде.
Как и многие, я использую мокко, чай, синон и синон-чай.Поскольку чай и сам синон используются так часто, я предпочитаю рассматривать их как части моей тестовой среды так же, как глобалы Мокко, такие как describe
, it
, context
, beforeEach
и т. Д.
Обычно я включаю в свои тесты установочный файл, который выглядит примерно так:
import chai from 'chai';
import sinon from 'sinon';
import sinonChai from 'sinon-chai';
chai.use(sinonChai);
global.expect = chai.expect;
global.sinon = sinon;
afterEach(function() {
sinon.restore();
});
Это добавляет утверждения sinon chai, дает мне и expect
, и sinon
как глобальные, итакже гарантирует, что любые подделки sinon будут восстанавливаться после каждого теста.
Первая проблема здесь, когда я начинаю писать свои тестовые файлы на TypeScript, заключается в том, что tsc
не имеет понятия об этих expect
и sinon
Глобал.Конечно, я могу добавить пакеты @types
для всего остального, но мне нужно как-то объявить эти два глобала для себя, или tsc
жалуется.
Я пытался добавить test-globals.d.ts
, который содержит следующее:
declare const expect: Chai.ExpectStatic;
declare const sinon: Sinon.SinonStatic;
Это прекрасно работает для expect
, но не для sinon
, потому что @types/sinon
по какой-либо причине предоставляет свое пространство имен с использованием строчной буквы 'S.'Поэтому я должен переключить его на это:
declare const expect: Chai.ExpectStatic;
declare const sinon: sinon.SinonStatic;
Но теперь новая глобальная переменная, кажется, затеняет пространство имен, так что это выплевывает cannot find namespace 'sinon'
.
Если я попытаюсьчтобы присвоить ему псевдоним перед объявлением global следующим образом:
type SinonStatic = sinon.SinonStatic;
declare const expect: Chai.ExpectStatic;
declare const sinon: SinonStatic;
Этот still , кажется, затеняет пространство имен и дает мне cannot find namespace 'sinon'
для первой строки.
Если я попытаюсь использовать псевдоним, используя вместо этого оператор import
, то, конечно, это заставит tsc
обрабатывать мой файл как модуль и отказываться соблюдать глобальные объявления внутри него, если я не включу одну из этих глупых директив ///
во всемои тестовые файлы.
Единственный способ, которым я могу обойти это, - просто вызвать мою глобальную переменную sinon
как-нибудь еще или просто импортировать sinon
в каждый тестовый файл.
Я, вероятно, в конечном итоге сделаю последнее, но меня раздражает, что я, кажется, не контролирую это.Я что-то упускаю или эти два варианта действительно являются моими единственными решениями?
Я предпочитаю исключить разветвление @types/sinon
, чтобы кстати изменить пространство имен.Я бы действительно предпочел не поддерживать такую вилку над чем-то вроде этого.