【问题标题】:How to use Jasmine to Spy on Modules being loaded by requireJS?如何使用 Jasmine 监视 requireJS 加载的模块?
【发布时间】:2017-02-21 22:46:03
【问题描述】:

所以我正在使用 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 调用在这种情况下工作?

【问题讨论】:

    标签: javascript typescript jasmine requirejs jasmine2.0


    【解决方案1】:

    找出答案,使用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. does not support relative paths

    【讨论】:

    • 你的意思是乡绅。我不推荐它用于超级简单的项目。它打破了 RequireJS 的基本公理。最大的问题是模块在与 Squire 一起使用时不再是单例的。这导致的症状很难追溯到其根本原因。 可能可以解决它,但对于不仅仅是超级简单的项目,它可能需要大量样板才能使模拟环境处于良好状态。 (例如,请参阅this issue。)
    • @Louis,是的,我的意思是 Squire,已修复。如果乡绅不是解决方案,那是什么?
    • 没有“一刀切”的解决方案。在某些项目中,我可以通过在iframe 中加载被测代码来解决该问题。这使我可以在启动测试之前摆弄 RequireJS 配置。 (Node 中的 JSDom 也允许在没有浏览器的情况下进行相同的操作。)对于那些项目 来说这很有意义,但不是通用的解决方案。有时,我会重新设计代码以方便测试。 TextFormatter 可以是具有 test 方法的类。 TextFormatter 的构造函数可以接受一个参数,该参数提供调用 .create 的对象。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    相关资源
    最近更新 更多