几周以来,我一直在阅读测试驱动开发:示例。现在,我坚持第 31 章——重构。我的问题是关于第 183 页上的迁移数据。我不明白这个主题。关于的例子TestSuite
也不能帮助我理解这一点。
我想知道迁移数据是什么意思以及如何在 TDD 中使用它。
[更新] 迁移数据一书中的内容
你如何从一种表现形式转变?临时复制数据。
如何: 这是内部到外部的版本,您可以在内部更改表示,然后更改外部可见的界面:
- 以新格式添加实例变量
- 在您设置旧格式的任何地方设置新格式变量
- 在使用旧格式的任何地方使用新格式变量
- 删除旧格式
- 更改外部接口以反映新格式
不过,有时您想先更改 API。那么您应该: - 添加新格式的参数 - 从新格式参数转换为旧格式内部表示 - 删除旧格式参数 - 用新格式替换旧格式的使用 - 删除旧格式
原因: 一对多每次都会产生数据迁移问题。假设我们想使用一对多来实现 TestSuite。我们将从:
def testSuite(self):
suite= TestSuite()
suite.add(WasRun("testMethod"))
suite.run(self.result)
assert("1 run, 0 failed" == self.result.summary())
通过以下方式实现(在一对多的“一”部分):
class TestSuite:
def add(self, test):
self.test= test
def run(self, result):
self.test.run(result)
现在我们开始复制数据。首先我们初始化测试集合:
TestSuite
def __init__(self):
self.tests= []
Everywhere “test” is set, we add to the collection, too:
TestSuite
def add(self, test):
self.test= test
self.tests.append(test)
现在我们使用测试列表而不是单个测试。出于当前测试用例的目的,这是一种重构(它保留了语义),因为集合中只有一个元素。
TestSuite
def run(self, result):
for test in self.tests:
test.run(result)
我们删除现在未使用的实例变量“test”:
TestSuite
def add(self, test):
self.tests.append(test)
在具有不同协议的等效格式之间移动时,您还可以使用逐步数据迁移,例如从 Java 的 Vector/Enumerator 移动到 Collection/Iterator。