假设我有以下类(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/