所以我正在使用Typescript / RequireJs / Jasmine,无法让我的间谍为另一个模块中加载的模块工作。
这是我的规格:
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");
}
}
在“ A测试”或“ B测试”中,我无法使间谍发挥作用。它总是调用实际的实现和错误。我可以更改
TextFormatter
,以允许其插入TextFormatter的定义,但这感觉很不对。在这种情况下,如何获得spyOn呼叫来工作?
最佳答案
找出答案,使用Squire.js。
it("A Test", (done) => {
const injector = new Squire();
var mock = { CrmWebApiLib: { create: () => { } }};
spyOn(mock.CrmWebApiLib, "create").and.callFake((a, b) => { });
injector
.mock("allgnt_/scripts/allgnt.restlib", mock)
.require(["new_/scripts/script/Dfnd.TextFormatter"], (mod) => {
mod.TextFormatter.test();
expect(mock.CrmWebApiLib.create).toHaveBeenCalled();
done();
});
});
只有两个小问题:
安装了Squire,而不是Squirejs,
它does not support relative paths。