gpt4 book ai didi

python - 单元测试设计和模拟

转载 作者:行者123 更新时间:2023-11-28 21:15:35 24 4
gpt4 key购买 nike

假设我有以下类(class)并且我想测试它。

class SearchRecommended:
def __init__(self, request2template):
self._r2t = request2template

def handle(self, request: Request):
return request.user().queries().add_recommendation_query().run(1).print(
RecommendedSearchMedia(self._r2t(request))
).message(RecommendedSearchMessage)

.user()返回的对象属于User “接口(interface)”和数据库相关。

class User(Equalable, ABC):
@abstractmethod
def user_id(self):
pass

@abstractmethod
def lang(self):
pass

@abstractmethod
def queries(self) -> "UserQueries":
pass

@abstractmethod
def subscriptions(self) -> "UserSubscriptions":
pass

@abstractmethod
def notifications(self) -> "UserSubsNotifications":
pass

@abstractmethod
def access(self) -> "UserAccess":
pass

def repr(self):
return self.user_id()

UserQueries , UserSubscriptions , UserSubsNotifications , UserAccess也是数据库交互类的基类。

据我所知,单元测试应该是快速的,不应该使用实际的数据库连接。单元测试也不应该太了解它们正在测试的代码的内部结构。

模拟整个数据库交互层是乏味的,但只模拟被测试方法中使用的方法似乎对内部代码“了解太多”。

我的代码不应该在 .handle 中吗?方法可以自由地从 User 调用它喜欢的任何方法接口(interface)(或它被模拟的对象)和后续的持久层类(只要这些调用对于给定的接口(interface)是正确的),除非我明确测试调用的方法顺序?

我是不是弄错了什么,我该怎么办?

最佳答案

您的方法 handle 不适合在单元测试中进行测试。 handle 所做的唯一事情就是与其他代码交互。但是,为了测试与其他代码的交互,您宁愿使用集成测试。

背景是,通过任何类型的测试,您的目标都是找到错误。通过单元测试,您可以尝试找出隔离代码中的错误。但是,如果您真的隔离了您的代码 - 会发现哪些错误?

您的代码中的错误更多的方向是“我是否以正确的顺序使用正确的参数调用其他对象的正确方法,并且返回值的形式是否符合我的预期。”所有这些问题都不会通过单元测试来回答,而是通过集成测试来回答。

关于python - 单元测试设计和模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58880214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com