如何对一个只改变内部状态的函数进行单元测试
How to unit test a function which only changes internal state
假设下面的类
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的唯一业务值是访问不变量的业务逻辑,即更改可观察系统的状态,即断言被调用的业务逻辑流的结果。
相关文章:
- 内部分区字体大小获胜'调整浏览器窗口大小时不会随媒体查询而更改
- 事件和状态
- AJAX错误状态代码500内部服务器错误
- 流星用户帐户 - 内部状态
- 显示/隐藏 ReactJS 组件而不会丢失其内部状态
- 无法加载资源:服务器在绑定功能中以状态 500(内部服务器错误)进行响应
- 为什么这个 HTML/JS 在更改内部 HTML 后会恢复到原始状态
- Angular ui路由器阻止指令内部的状态触发
- 如何根据链接内部状态更改列表项的颜色
- Ajax错误:加载资源失败:服务器响应状态为500(内部服务器错误)
- 在angular.js控制器中为应用的内部状态定义变量来显示/隐藏元素
- 使用状态"onEnter"触发控制器内部的一个函数;函数
- 加载资源失败:服务器响应状态为500(内部服务器错误)MVC JAVASCRIPT
- 如何访问Redux reducer内部的状态
- 如何对一个只改变内部状态的函数进行单元测试
- 我是否应该改变一个已承诺并已解决的值的内部状态
- 将可折叠的内部模态dos't保持打开状态
- React无状态组件-如何组织内部函数
- 将状态绑定到 React 中映射函数内部的条件语句
- 使用YouTube Iframe API内部的jquery插件来获取状态