首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我是否应该将一个对象传递给构造函数(如果是,如何处理测试?)

我是否应该将一个对象传递给构造函数(如果是,如何处理测试?)
EN

Stack Overflow用户
提问于 2020-11-13 10:49:13
回答 2查看 60关注 0票数 0

假设我有一个"HamburgerCooker“,它是用来做汉堡的,它是用一个”请求“类构造的。

假设一个“请求”对象是用一堆信息构造的,并返回一堆煮汉堡包所需的变量。

因此,我们有以下代码:

代码语言:javascript
运行
复制
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()也不会返回预期的结果。

那我怎么能测试这个?我希望避免使用模拟库,因此我看到了几种解决方案:

  • 使用一些原始数据(字符串、ints.)在HamburgerCooker构造函数中,或直接在make_burger方法的参数中,但我觉得它不尊重OOP最佳实践

  • 在HamburgerCooker中添加了一个只用于模拟

的setter

  • 认为这对夫妇的要求/汉堡包是一个相同的单位,如果他们在一起进行测试是可以的。

最好的选择是什么?

对不起,如果我写了一些错误,英语不是我的母语+这个代码是一个隐喻的例子,这就是为什么它可能不是100%的正确,它不会在任何地方执行

我倾向于避免模仿解决方案,因为我的学徒开发环境非常安全,我们使用Python2.x

EN

回答 2

Stack Overflow用户

发布于 2020-11-13 15:06:18

设计是我们为了得到更多我们想要的东西而做的事情,而不是仅仅通过这样做就能得到更多的东西。露丝·马兰

你在这里真正要问的是一个设计问题--这台机器并不特别关心你选择哪一个选项。

任何“设计”问题的答案都将是“它取决于”,具体来说,它取决于“你想要的更多”是什么。

TDD的潜移默化的假设是:如果“你想要的更多”是“应该很容易测试”,那么你也会得到一堆其他的“你想要的更多”,免费。

因此,宽泛的规则是“做能让测试变得更容易的事情”。通常,这将意味着将一个想法分解成更小的部分,只是为了使测试更容易。

一种常见的模式是区分初始化对象和使用一个对象创建另一个对象。在python中,这通常表现为一个非常简单的__init__方法(它初始化数据成员,而不是其他任何东西),以及一个或多个从其他数据结构复制数据并将数据传递给__init__的“工厂方法”。

根据这里的信息,我希望Request组件和HamburgerCooker组件会因不同的原因而发生不同的变化。

Request提取信息并将其传递给HamburgerCooker.__init__的工厂方法显然将耦合到这两个组件。这也没问题。“单元测试”是一种测试策略,但它们并不是唯一的测试策略。允许自己测试多个组件的组合,这样做是有意义的。

票数 1
EN

Stack Overflow用户

发布于 2020-12-13 08:05:59

您不需要使用模拟库就可以进行模拟。在大多数情况下,你可以嘲笑自己需要什么。图书馆只会让事情变得更简单。创建一个MockRequest类,通过重写所有方法并返回模拟值来继承请求并伪造其中的所有内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64819578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档