2011-02-06 71 views
1

我目前正在为一个Python微博库编写一组单元测试,并且在这里接收到的建议已经开始使用模拟对象来返回数据,就好像来自服务一样(identi.ca在这种情况下)。使用模拟对象而不关联单元测试

但是,当然通过模拟httplib2 - 我用来请求数据的模块 - 我将单元测试绑定到我的库的特定实现,并且移除重构后它们的功能(显然它是一个主要在寒冷的地方进行单元测试的好处)。

是否有两全其美的情景?我能想到的唯一办法就是建立一个微博服务器,仅用于测试,但这显然是一项大量的工作。

回答

1

你说得对,如果你重构你的库来使用非httplib2的东西,那么你的单元测试将会中断。这不是一个可怕的依赖关系,因为当时间到了的时候,改变你的测试来模拟新的库会很简单。

如果你想避免这种情况,那么写一个非常简单的httplib2包装,你的测试可以嘲笑它。那么如果你从httplib2转移,你只需要改变你的包装。但请注意,您必须更改的行数是相同的,所有这些变化都是在“测试代码”还是“非测试代码”中。

+0

我认为包装可能(至少在理论上)减少了换用httplib2所需的更改大小。没有包装,你需要改变正在测试的类*和*样机对象。使用包装器,你只需要改变包装器(旧的模型仍然可以工作。)这当然假定包装器的API足够普遍,在交换库后不会改变。 – 2011-02-10 08:53:28

1

不知道你的问题是什么。模拟课程至少在概念上是测试的一部分。测试可以依赖于他们注入正在测试的代码中的模拟对象的特定行为。当然,注入本身应该在单元测试中共享,这样很容易改变模型实现。

相关问题