假设以下课程
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
并检查回调是否被调用。但是,这不是集成测试。
一般来说,单元测试函数只有内部效应的方法是什么?
答案 0 :(得分:1)
我认为,如果您的方法只更改了内部状态,那么验证这种方法的唯一方法是通过可公开访问的方法(例如,如果您的类具有.count()
函数,则可以在之后检查。)
如果没有外部机制来验证内部操作,则很难检查。
有时在C#中如果这是非常重要的逻辑,我会使用[InternalsVisibleTo]
属性来检查(在你的情况下是_cbs
)类的内部状态。
或者,如果这不是非常重要的功能,那么知道函数被调用就足够了。因此,在该示例中,您可以提供模拟的_cbs
作为参数,并检查是否已调用.push()
。
答案 1 :(得分:1)
在这种情况下,您的aggregate是Observable
类,其中invariant名为_cbs
。现在,您可以测试System Under Test的唯一商业价值是访问不变量的业务逻辑 - 它改变了可观察系统的状态 - 即断言被调用业务逻辑流的结果。