我有一个类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>
答案 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的测试不依赖于它的实现,就是创建一个具有工作get
和set
的模拟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
// ...