单元测试设计和模拟

单根瘤菌

假设我有以下课程,我想测试它。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章