单元测试有状态 RequireJS 模块的模式

Pattern for unit testing stateful RequireJS modules

本文关键字:模式 模块 RequireJS 状态 单元测试      更新时间:2023-09-26

假设我有一个 RequireJS 模块,我的应用程序中只有一个实例(假设它执行异步操作并向其传递回调(:

// modules/myModule
define(function(){
    var module = function(){
        var self = this;
        self.runSomething(){
            console.log("hello world");
        };
    };
    return new module();
});

我想对此模块的实例进行单元测试,我发现自己以这种方式构建模块:

// modules/myModule
define(function(){
    return function(){
        var self = this;
        self.runRouting(){
            console.log("hello world");
        };
    };
});
// modules/myModuleInstance
define(["modules/myModule"], function(myModule){
    return new myModule();
});

这为我提供了一些没有附加状态的东西,然后我可以从我的单元测试中戳出来,所以在我的单元测试中,我从不引用modules/myModuleInstance,只引用modules/myModule,我每次都为每个测试构建它。 然后,应用程序引用modules/myModuleInstance

这感觉像是一种反模式。 我讨厌在那里有额外的"模块实例"部分。 我知道单元测试中的设置和拆卸方法,并且可以以这种方式维护实例,但是在目睹了 C# 在尝试对大量单例进行单元测试时会发生什么,在单元测试之间摆弄状态是我真正想要避免的事情,尤其是使用动态语言。

在这种情况下,人们通常会怎么做?

在Luke McGregor的评论之后,很明显我在第一个代码片段中的内容很好。 使用 testr.js我可以定义一个运行测试的模块,如下所示:

// tests/myModuleTests
define(["modules/myModule"], function(myModule){
    var instanceOfModule = testr(myModule);
    // run some tests
    var anotherInstanceOfModule = testr(myModule);
    // run some other tests
});