如何对仅改变内部状态的功能进行单元测试

时间:2016-08-10 13:15:12

标签: javascript unit-testing

假设以下课程

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并检查回调是否被调用。但是,这不是集成测试。

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

2 个答案:

答案 0 :(得分:1)

我认为,如果您的方法只更改了内部状态,那么验证这种方法的唯一方法是通过可公开访问的方法(例如,如果您的类具有.count()函数,则可以在之后检查。)

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

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

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

答案 1 :(得分:1)

在这种情况下,您的aggregateObservable类,其中invariant名为_cbs。现在,您可以测试System Under Test的唯一商业价值是访问不变量的业务逻辑 - 它改变了可观察系统的状态 - 即断言被调用业务逻辑流的结果。