如何对依赖于另一个类的类进行单元测试来改变某些状态?

时间:2010-06-28 22:09:24

标签: unit-testing tdd mocking decoupling

我有一个类A,其中包含类B的实例,而foo的函数A调用set的函数B ,更新B的状态。这是一个代码示例(在Javascript中):

A = function () {
    this.init = function (b) {
        this.b = b
    }

    this.foo = function (val) {
        this.b.set(val)
    }

    this.bar = function () {
        return this.b.get()
    }

}

B = function () {
    this.set = function (val) {
        this.v = val
    }

    this.get = function () {
        return this.v
    }
}

如何对foo函数进行单元测试,同时保持A的测试不依赖于B的实现(使用模拟和存根,什么不是)?< / p>

2 个答案:

答案 0 :(得分:3)

使用模拟,您可以简单地A模拟B,这将检查是否使用适当的值调用了set。如果您没有模拟框架,那么在JavaScript中您只需创建一个对象:

b = {  
       setCalled: false,
       expectedValue: <expected>
       set: function(val) {
         <check that val == this.expectedValue>
          this.setCalled = true;
       }
     }

在您设置b的测试中,使用给定的A创建b,然后致电A.foo并检查b.setCalled是否已更改为true }。您可以类似地向b添加get方法以检查A.bar

在这种情况下,您还应该检查气味Feature Envy - 当两个类紧密耦合时,您应该检查以确定您没有使用不正确的东西。在你的真实例子中可能没什么问题,但值得一试。

答案 1 :(得分:0)

我想出了最好的方法,同时确保A的测试不依赖于它的实现,就是创建一个具有工作getset的模拟B,但是写一个临时变量。

测试A的代码示例:

// Mock B
b = new function () {
    this.set = function (val) {
        this.v = val
    }

    this.get = function () {
        return this.v
    }
}

// Create an instance of A with Mock B
a = new A().init(b)

// Test A

// ...