1

所以我正在使用 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();
    });
});

这是文本格式化程序:

import { RestLib, CrmWebApiLib }    from "../../../allgnt_/scripts/allgnt.restlib";

export module TextFormatter {
    export function test() {
        CrmWebApiLib.create("A", "Test");
    }
}

在“A 测试”或“B 测试”中,我无法让间谍发挥作用。它总是调用实际的实现和错误。我可以更改它TextFormatter以允许注入 TextFormatter 的定义,但这感觉不对。

如何让 spyOn 调用在这种情况下工作?

4

1 回答 1

0

找出答案,使用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();
        });

});

只有两个小问题:

  1. 安装了 Squire,而不是 Squirejs,
  2. 不支持相对路径
于 2017-02-22T14:47:38.960 回答