У меня были проблемы с отслеживанием экспортированной функции в приложении NodeJS (v9.6.1) с использованием Jasmine.
Приложение написано в машинописном тексте и переносится с помощью tsc в папку dist для выполнения в виде javascript.
Приложение
У меня есть файл утилит Foo (foo.utils.ts), который экспортирует функции:
import {readFile} from "fs";
export function getData(filePath: string){
const data = readFile(filePath)
// various checks happens here.
return data;
}
и класс Bar в файле bar.ts:
import {getData} from "../utils/foo.utils
export class Bar {
public do(){
// ... does stuff
const data = getData(filePath);
// etc.
}
}
Тест
Теперь я пытаюсь шпионить за экспортированным методом getData
, чтобы проверить, был ли он вызван, и вернуть поддельное значение.Я не хочу читать файл в моем модульном тесте (и даже вообще использовать настоящий метод getData
)
Файл bar.spec.ts для тестирования:
describe("Bar", ()=>{
let bar: Bar;
beforeEach(function() {
bar = new Bar();
})
it(" should do stuff", ()=>{
const spy = spyOn(???, "getData").and.returnValue([]);
bar.do();
expect(spy).toHaveBeenCalled();
})
});
Проблемы
Поскольку это приложение NodeJS, я пытался использовать global
в качестве объекта для шпионажа, но я получаю ошибку:
Ошибка:Метод getAttachementData () не существует
Я также пытался добавить
import * as fooutils from ".../src/utils/foo.utils
И шпионить за fooutils
, но я все еще выполняю экспортированную функцию (и вылетает, когдаон пытается прочитать файл ...)
Теперь я немного потерян.Из того, что я обнаружил, на самом деле невозможно смоделировать экспортированную функцию (даже если они должны быть добавлены к объекту global
).Я думал о рефакторинге файла utils для создания класса utils, который экспортирует статический метод и следит за ними.
Вопросы
- Я что-то не так делаю?
- можно ли шпионить (и заменить) экспортированную функцию?
- Будет ли работать статический метод в классе (а не функция экспорта)?
- Любой другой способ?