假设我有一个"HamburgerCooker“,它是用来做汉堡的,它是用一个”请求“类构造的。
假设一个“请求”对象是用一堆信息构造的,并返回一堆煮汉堡包所需的变量。
因此,我们有以下代码:
class Request(self, foo1, foo2):
def __init__(self, foo1, foo2):
initialize_foo()
def return_something():
return_foo_processed()
class HamburgerCooker:
def __init__(self, request):
"""
Initialize some attributes with some "request" public methods
"""
def make_burger():
"""
Use some private attributes and return a burger
"""
如您所见,make_burger()依赖于请求类的良好实现:如果请求类不能正常工作,即使正确实现,make_burger()也不会返回预期的结果。
那我怎么能测试这个?我希望避免使用模拟库,因此我看到了几种解决方案:
的setter
最好的选择是什么?
对不起,如果我写了一些错误,英语不是我的母语+这个代码是一个隐喻的例子,这就是为什么它可能不是100%的正确,它不会在任何地方执行
我倾向于避免模仿解决方案,因为我的学徒开发环境非常安全,我们使用Python2.x
发布于 2020-11-13 15:06:18
设计是我们为了得到更多我们想要的东西而做的事情,而不是仅仅通过这样做就能得到更多的东西。露丝·马兰
你在这里真正要问的是一个设计问题--这台机器并不特别关心你选择哪一个选项。
任何“设计”问题的答案都将是“它取决于”,具体来说,它取决于“你想要的更多”是什么。
TDD的潜移默化的假设是:如果“你想要的更多”是“应该很容易测试”,那么你也会得到一堆其他的“你想要的更多”,免费。
因此,宽泛的规则是“做能让测试变得更容易的事情”。通常,这将意味着将一个想法分解成更小的部分,只是为了使测试更容易。
一种常见的模式是区分初始化对象和使用一个对象创建另一个对象。在python中,这通常表现为一个非常简单的__init__
方法(它初始化数据成员,而不是其他任何东西),以及一个或多个从其他数据结构复制数据并将数据传递给__init__
的“工厂方法”。
根据这里的信息,我希望Request
组件和HamburgerCooker
组件会因不同的原因而发生不同的变化。
从Request
提取信息并将其传递给HamburgerCooker.__init__
的工厂方法显然将耦合到这两个组件。这也没问题。“单元测试”是一种测试策略,但它们并不是唯一的测试策略。允许自己测试多个组件的组合,这样做是有意义的。
发布于 2020-12-13 08:05:59
您不需要使用模拟库就可以进行模拟。在大多数情况下,你可以嘲笑自己需要什么。图书馆只会让事情变得更简单。创建一个MockRequest类,通过重写所有方法并返回模拟值来继承请求并伪造其中的所有内容。
https://stackoverflow.com/questions/64819578
复制相似问题