javascript - 如何对仅更改内部状态的函数进行单元测试

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

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

最佳答案

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

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

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

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

关于javascript - 如何对仅更改内部状态的函数进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38874551/

相关文章:

node.js - Node 中的 Mocking 依赖(主要用于单元测试)

javascript - jQuery - 无法获取使用 load() 方法从另一个文件加载的 header 的高度

java - 如何创建 ServletContext 的模拟属性?

python - 如何使用脚本将 python 3 单元测试拆分为单独的文件来控制运行哪一个?

javascript - jQuery 用户界面 : Two semicolons after logical expression with function wrapper

c# - 检查对象时 NUnit Has.Member 失败

Python unittest 和 mock : Check if a function gets called, 然后停止测试

javascript - jQuery:将响应文档加载到div中

javascript - Javascript 中的堆排序实现

javascript - 重叠 SVG 元素的鼠标处理未按预期工作