监视模拟对象访问器(获取并设置)

时间:2018-11-27 15:22:28

标签: unit-testing jasmine mocking stub

在测试角度分量时模拟依赖关系。 ComponentA注入ServiceA,我想在测试中模拟serviceA

class ServiceA {
    private _prop = 1;

    get prop (): number {
        return this._prop;
    }

    set prop(p: number) {
        this._prop;
    }
}

class ComponentA {
    private injectedService: ServiceA;

    constructor(private injectedService: ServiceA) {
        this.injectedService = injectedService;
    }

    method () {
        this.injectedService.prop = this.injectedService.prop + 1;
        if (this.injectedService.prop === 5) {
            this.injectedService.prop = 1;
        }
    }
}

使用上述程序结构,重要的是要有一个具有accessor(injectedService.prop的getter和setter)实现的serviceA模拟程序,因为程序的一部分取决于先前设置的injectedService.prop的值。

我尝试过的选项:

ts-mockito: ts-mockito模拟没有设置访问类型。由于这个限制,ts setter将不会被识别。一种解决方法是定义实际方法以“设置”和“获取”并调用这些方法。设置者仍将需要以下解决方法:

// default get stub
when(mock.getProp()).thenReturn();

// setter redefines get stub
when(mock.setProp(anything())).thenCall((p) => {
    when(mock.getProp()).thenReturn(a);
});

typemoq:

  • static mock调用构造函数,将目标模拟类作为其他依赖项注入时存在很大缺陷

  • dynamic mock这样的条件(this.injectedService.prop === 5)永远不会是真实的,因为this.injectedService.prop(即mock.object.prop)指向一个函数。关于这一点,我觉得可能还有一种方法尚待解决,我将不胜感激

  • (个人喜好),我更喜欢茉莉花spyOn而不是typemoq verify来进行模拟。如果不可能的话,可以忽略掉它。

我不想做的事

  • 除了添加标准打字稿访问器之外,我不想修改要模拟的类

  • 我不想仅出于创建用于测试的模拟的目的而创建要模拟的类的接口/类

尽管我愿意在有充分的理由或标准的情况下对此做出妥协

如果有人能引导我进入经过适当测试并且遵循标准(如果有)的代码库,我也将不胜感激。

注意:我正在使用karma +茉莉花来测试一个有角度的应用程序...但是所有这些都不算什么,因为我只是从构造函数创建类,没有Testbed只是简单的打字稿类单元测试。

0 个答案:

没有答案