繁体   English   中英

如何在requirejs的测试中注入模块到单元测试应用程序?

[英]How to inject module in test for requirejs to unit test application?

我有两个模块,ModuleA 和 ModuleB。 ModuleB 依赖于 ModuleA。 但据我所知,requirejs 是一种服务定位器。 那么我如何在我的代码中对这种模式进行单元测试。

define('moduleA', function() {
    var ModuleA = function() {
        this.doSomething = function() {
            return true;
        }
    }
    return ModuleA;
});

define('moduleB', ['moduleA'], function(ModuleA) {
    var moduleA = new ModuleA();
    var ModuleB = function() {
        this.doSomethingElse = function() {
            if(moduleA.doSomething()) {
                // do something else and return

            } else {
                // do other things and return
            }
        }
    }

    return ModuleB
});

/*Test for moduleB*/
define('test', ['moduleB', function(ModuleB) {
    describe('', function() {
        var moduleB = new ModuleB();
        expect(moduleB.doSomethingElse()).toBe(true);
    });
});

因为 ModuleA 会一直被初始化。 无论如何,我可以向 ModuleB 注入一些模拟并进行测试吗? 而且我不想使用单例,因为我不确定测试是否会因为不可预见的行为而继续失败。

注意:我只是输入代码,所以它们可能是一些编译错误。

此代码模式不可单元测试。 我想有人可以想出一种方法来欺骗 RequireJS 加载不同的模块定义并在测试结束时卸载它,但这太复杂且太容易出错,并且无法解决糟糕的编码实践问题。

该模式不可测试,因为在 moduleB 定义内部,您正在创建 moduleA 的新实例(加上 ModuleA 的加载是“硬编码”)。 要使其可测试,您需要注入它。 考虑这样的事情:

define('moduleB', function() {
    var ModuleB = function(moduleA) {
        this.__moduleA = moduleA;
        this.doSomethingElse = function() {
            if(this.__moduleA.doSomething()) {
                // do something else and return

            } else {
                // do other things and return
            }
        }
    }

    return ModuleB
});

为了进一步探索这个小重构,我建议阅读“依赖注入”。 跳过像Guice这样的DI工具,直接进入DI思想的核心。

Misko Hevery 有几篇关于这种 OOP 模式的有趣帖子,包括如何处理“new”关键字: http : //misko.hevery.com/2008/09/10/where-have-all-the-new-operators-走了/

我现在找不到它,但我相信 Misko 有关于 OOP 中的 3 个层次结构的好帖子,继承层次结构(最明显),创建层次结构(谁创建了什么)和依赖层次结构(谁使用谁)。 这3个层次是完全不同的。 通常,如果 B 类创建 A 类,则不应使用它。 B 类的角色似乎是一个工厂——它创建实例。 应该有一些其他类 C 正在使用类 A 的注入实例来执行一些业务逻辑。

附带说明一下,既然您已经在使用 AMD 模块和 JS“类”,为什么不让您的类/对象看起来和行为更像正确的 OOP 类/对象? Dejavu 可以帮助您: http : //wojciechszela.com/blog/2014/01/13/object-oriented-programming-in-javascript/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM