Так что я использую TypScript/RequireJs/Jasmine и не могу заставить своего шпиона работать для модулей, загружаемых в другой модуль.Как использовать Жасмин для шпиона на модулях, загружаемых requireJS?
Вот мой Spec:
import { CrmWebApiLib } from "../../../webresources/allgnt_/scripts/Allgnt.RestLib";
import { TextFormatter } from "../../../webresources/new_/scripts/script/TextFormatter";
describe("Test",() => {
it("A Test",() => {
spyOn(CrmWebApiLib, "create").and.callFake((a, b) => { });
TextFormatter.test();
expect(CrmWebApiLib.create).toHaveBeenCalled();
});
it("B Test",() => {
var stub = {
CrmWebApiLib: {
create(a, b) { }
}
};
define("../../../webresources/allgnt_/scripts/Allgnt.RestLib", [], stub as any);
spyOn(stub.CrmWebApiLib, "create").and.callFake((a, b) => { });
TextFormatter.test();
expect(CrmWebApiLib.create).toHaveBeenCalled();
});
});
Вот TextFormatter:
import { RestLib, CrmWebApiLib } from "../../../allgnt_/scripts/allgnt.restlib";
export module TextFormatter {
export function test() {
CrmWebApiLib.create("A", "Test");
}
}
В любом "Тестовый" или "B Test" Я не могу получить шпиона функционировать. Он всегда вызывает фактическую реализацию и ошибки. Я могу изменить TextFormatter
, чтобы можно было вставлять определение TextFormatter, но это просто неправильно.
Как получить вызов spyOn для работы в таких ситуациях?
Вы имеете в виду Squire. Я не рекомендую его для более простых проектов. Это нарушает основные аксиомы RequireJS. Наиболее проблематичным является то, что модули перестают быть синглонами при использовании с Squire. Признаки, которые могут возникнуть, могут быть очень трудно отследить до их основной причины. Это возможно *, чтобы обойти это, но для более чем супер простого проекта это может потребовать * большого количества шаблонов *, чтобы получить издеваемую среду в хорошем состоянии. (См. [Этот вопрос] (https://github.com/iammerrick/Squire.js/issues/39) для примера.) – Louis
@Louis, Да, я действительно имел в виду Squire, исправленный. Если сквайр не является решением, чем то, что есть? – Daryl
Нет решения «одного размера для всех». В некоторых проектах мне удалось решить проблему, загрузив тестируемый код в 'iframe'. Это позволило мне возиться с конфигурацией RequireJS перед запуском теста. (JSDom в узле также разрешает то же самое без браузера.) Это имело смысл * для этих проектов *, но не является общим решением. Иногда я переработал код, чтобы упростить тестирование. 'TextFormatter' может быть классом, который имеет метод' test'. Конструктор 'TextFormatter' может принимать параметр, который предоставляет объект, на который вызывается' .create'. – Louis