首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试设计与模拟

单元测试设计与模拟
EN

Stack Overflow用户
提问于 2019-11-15 15:33:57
回答 2查看 47关注 0票数 0

假设我有下一节课,我想测试它。

代码语言:javascript
复制
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“接口”,与数据库相关。

代码语言:javascript
复制
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()

UserQueriesUserSubscriptionsUserSubsNotificationsUserAccess也是数据库交互类的基类.

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

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

我在.handle方法中的代码不应该自由地调用它从User接口(或它正在被嘲弄的对象)和随后的持久性层类(只要这些调用对于给定接口是正确的)所喜欢的任何方法,除非我显式地测试调用的方法的顺序?

我是不是搞错了&我该怎么办?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-24 19:51:34

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

背景是,通过任何一种测试,您的目标都是查找bug。通过单元测试,您可以在孤立的代码中找到bug。但是,如果你真的隔离了你的代码--有哪些But可以找到呢?

代码中的bug更倾向于“我是否以正确的顺序调用具有正确参数的其他对象的适当方法,并且返回值是否以我期望的形式出现”。所有这些问题都不是通过单元测试来回答的,而是通过集成测试来回答的。

票数 1
EN

Stack Overflow用户

发布于 2019-11-15 15:49:47

你的单位需要确保类做它应该做的事情。为了实现您的类需要某些功能,在本例中是类用户的一个版本。

您的类对用户有足够的了解,可以调用它的方法和方法的结果,所以您的测试已经足够让这些调用按预期工作了。

你的模仿者实际上不需要制作一个假数据库,也不必有真正的功能,它只需要看起来就像真的一样。如果您只关心是否按顺序调用数据层,只需将函数链的每一步设置为true或其他内容,并在测试结束时验证所有var是否为true。不是很好,但它确保这个类按预期调用数据层。

长期而言,如果您必须继续这样做,对用户或类似类进行双重测试,根据需要添加功能。

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

https://stackoverflow.com/questions/58880214

复制
相关文章

相似问题

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