javascript – Squire.js在使用商店时不会替换假依赖

我正在尝试将Squire.js作为RequireJS的依赖加载器.使用完全正常的Web浏览器运行单元测试.我想用商店来处理我的嘲笑.但无法阻止Squire加载实际模块.

模拟工作正常:

define(['lib/squire'],function (squire) {
    var injector = new squire();

    injector
    .mock('modules/dependency',{
        run: function () {
            console.log("fake dependency run");
        }
    })
    .require(['modules/module-under-test'],function (module) {
        module.run();
    });
});

控制台输出

module under test loaded       module-under-test.js:2
module under test run          module-under-test.js:5
fake module run                module-test.js:8

但是当我使用这样的商店时:

define(['lib/squire'],function (squire) {
    var injector = new squire();

    injector
    .store('modules/dependency')
    .require(['modules/module-under-test','mocks'],function (module,mocks) {
        mocks.store["modules/dependency"] = {
            run: function () {
                console.log("fake dependency run");
            }
        };
        module.run();
    });
});

使用和运行真实的:

real dependency loaded      dependency.js:2
module under test loaded    module-under-test.js:2
module under test run       module-under-test.js:5
real dependency run         dependency.js:5

Squire在文档的头版上说这是可以的.使用来自Github的最新版本的Squire.js,以及来自requirejs.org的最新RequireJS.我究竟做错了什么?

最佳答案
我没有看到你在第二个例子中调用run的位置,但我认为它是在mocks.store [“modules / dependency”]的赋值之后.

我认为这里的问题是你试图存根整个依赖,而不仅仅是run方法.这种方法适用于第一种情况,因为依赖性尚未解决.在第二种情况下,被测模块已经引用了依赖性.因此,替换Squire已经“存储”的副本什么都不做.我相信使用商店的正确方式如下:

mocks.store["modules/dependency"].run = function () {
    console.log("fake dependency run");
};

简而言之,如果您想要替换整个依赖项,那么这就是mock的用途. Store仅允许您在受测试代码访问依赖项之前对其进行存根. (因此,如果测试中的代码在加载时调用run,而不是在测试时调用,则仍需要使用mock.)

有一种替代方法,对于使用on-load强制您使用mock的情况,您只想在依赖关系可以解析的值上存储一些属性.首先需要依赖,同时你需要Squire.存根需要存根的方法.然后使用mock让Squire在解析被测模块的依赖关系时使用部分存根的依赖关系.在您的情况下,这将看起来像:

define(['lib/squire','modules/dependency'],function (squire,dep) {
    var injector = new squire();

    dep.run = function () {
        console.log("fake dependency run");
    };

    injector
    .mock('modules/dependency',dep)
    .require(['modules/module-under-test'],function (module) {
        module.run();
    });
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)