2010-06-28 92 views
1

我有一个类A其中包含B类的实例和A函数foo调用B函数set,它更新了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的实现(使用嘲弄和存根,什么不可以) ?

回答

0

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

代码示例来测试:

// 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 

// ... 
3

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

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

测试你设置b,创建与给定bA然后调用A.foo,检查b.setCalled改为true 。您可以类似地将一个get方法添加到b以检查A.bar

在这种情况下,您还应该检查气味Feature Envy - 当两个班级紧密联系在一起时,您应该检查以确保您没有错误地使用某些东西。在你的真实例子中可能没问题,但它值得检查。

+0

“小功能妒”应该是“闻” – 2010-06-28 22:31:32

+0

这是否意味着测试依赖于实现,这是不好的TDD?如果'foo'的实现改变了,所以它不使用'B'的'set'呢? – Chetan 2010-06-28 23:02:39

+0

请求是用模拟B进行测试。我通常不会模拟B,除非A的外部行为是如何影响B的(例如,如果B是外部库)。关于嗅觉的说明是这种类型的行为(A)可能是有问题的 – 2010-06-29 13:52:08

相关问题