1

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

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(使用模拟和存根等等)的实现?

4

2 回答 2

3

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

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

在您设置的测试中,使用给定的then 调用b创建一个并检查是否更改为. 您可以类似地添加一个 get 方法来检查 。AbA.foob.setCalledtruebA.bar

在这种情况下,您还应该检查Feature Envy的气味——当两个类如此紧密耦合时,您应该检查以确保您没有错误地使用某些东西。在您的真实示例中可能没问题,但值得一试。

于 2010-06-28T22:22:04.937 回答
0

我想出了最好的方法来做到这一点,同时确保 A 的测试不依赖于它的实现,将创建一个具有工作的模拟 Bgetset,但写入一个临时变量。

测试 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

// ...
于 2010-07-12T04:52:13.990 回答