如何对一个只改变内部状态的函数进行单元测试

How to unit test a function which only changes internal state

本文关键字:状态 内部 函数 单元测试 改变 一个      更新时间:2023-09-26

假设下面的类

class Observable() {
    constructor() { this._cbs = []; }
    on(cb) {
        this._cbs.push(cb);
    }
    off(cb) {
         this._cbs.splice(this._cbs.indexOf(cb));
    }
    trigger() {
        this._cbs.forEach((cb) => cb());
    }
}

我应该如何对on方法进行单元测试。现在我可以检查this._cbs数组并简单地验证回调是否被压入其中。但如果我这样做,我就把实现知识应用到我的测试中。或者我可以监视回调函数,调用trigger并检查回调函数是否被调用。然而,这不是一个集成测试。

所以一般来说,单元测试函数只有内部效果的方法是什么?

我认为,如果你的方法只改变内部状态,唯一的方法来验证这将是通过公开访问的方法(例如,如果你的类有一个.count()函数,你可以检查之后。)

如果没有外部机制来验证内部操作,则很难进行检查。

有时在c#中,如果这真的是很重要的逻辑,我会使用[InternalsVisibleTo]属性来检查(在你的情况下是_cbs)类的内部状态。

或者,如果这不是非常重要的功能,那么知道函数被调用就足够了。因此,在该示例中,您可以提供模拟的_cbs作为参数,并检查.push()是否被调用。

在本例中,您的聚合是类Observable,它有一个称为_cbs的不变量。现在,您可以测试System Under test的唯一业务值是访问不变量的业务逻辑,即更改可观察系统的状态,即断言被调用的业务逻辑流的结果。