假设我有以下课程,我想测试它。
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
“接口”,与数据库相关。
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
接口(或它被模拟的对象)和后续的持久层类(只要这些调用对于给定的接口是正确的)自由调用它喜欢的任何方法,除非我明确地测试调用的方法顺序?
我有什么问题吗?我该怎么办?
您的方法handle
不适合在单元测试中进行测试。唯一handle
能做的就是与其他代码交互。但是,为了测试与其他代码的交互,您宁愿使用集成测试。
背景是,通过任何类型的测试,您的目标都是找到错误。通过单元测试,您可以尝试找到隔离代码中的错误。但是,如果你真的隔离你的代码 - 有什么错误可以找到?
您的代码中的错误更多是在“我是否以正确的顺序使用正确的参数调用其他对象的正确方法,并且返回值的形式是否符合我的预期”。所有这些问题都不会通过单元测试来回答,而是通过集成测试来回答。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句