使用 Jasmine 进行单元测试,模拟构造函数

ser*_*gei 4 javascript unit-testing jasmine

我正在使用 Jasmine 对 JavaScript 进行单元测试,但遇到了一些问题。

我有一个大文件要测试,它有很多依赖项,而这些依赖项有自己的依赖项。由于上述依赖关系,我想尽可能地模拟。问题就在这里。如何模拟构造函数以使其包含属于它的方法?

假设我正在测试createMap类的方法Map

在该createMap方法中,它使用调用Layers类构造函数

var layers = new Layers()
Run Code Online (Sandbox Code Playgroud)

我正在监视它使用

spyOn(window, 'Layers').and.callThrough()
Run Code Online (Sandbox Code Playgroud)

这工作正常,但稍后在createMap它调用的方法中,layers.addLayer()whereaddLayerLayers类的方法。问题是,因为我嘲笑了Layers调用,所以它无法识别该addLayer方法。

有没有办法模拟它以便它包含被调用类的所有方法,或者是我唯一的选择是存根整个Layers类还是不模拟它?

或者什么是处理这个问题的好方法?我试过,spyOn(Layers, 'addLayer')但那里说没有addLayer找到方法。

如果有点混乱,我很抱歉。我很难思考我应该如何问它。

Pav*_*vlo 5

IMO,没有必要 spy on window,因为您可以通过创建一个同名的 spy 对象轻松地在本地范围内隐藏变量

describe('Map', function () {
    var Layers;

    beforeEach(function () {
        Layers = function () {
            // alternatively, you could move this to Layers.prototype
            this.addLayers = jasmine.createSpy('Layers#addLayers');
        };
    });

    /* ... */
});
Run Code Online (Sandbox Code Playgroud)

如果您想要自动模拟和使用 CommonJS 模块,您可以尝试构建在 Jasmine 之上的Jest框架。