假设我有下一节课,我想测试它。
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接口(或它正在被嘲弄的对象)和随后的持久性层类(只要这些调用对于给定接口是正确的)所喜欢的任何方法,除非我显式地测试调用的方法的顺序?
我是不是搞错了&我该怎么办?
发布于 2019-11-24 19:51:34
您的方法handle不适合在单元测试中进行测试。handle所做的唯一的事情就是与其他代码交互。但是,为了测试与其他代码的交互,您更愿意使用集成测试。
背景是,通过任何一种测试,您的目标都是查找bug。通过单元测试,您可以在孤立的代码中找到bug。但是,如果你真的隔离了你的代码--有哪些But可以找到呢?
代码中的bug更倾向于“我是否以正确的顺序调用具有正确参数的其他对象的适当方法,并且返回值是否以我期望的形式出现”。所有这些问题都不是通过单元测试来回答的,而是通过集成测试来回答的。
发布于 2019-11-15 15:49:47
你的单位需要确保类做它应该做的事情。为了实现您的类需要某些功能,在本例中是类用户的一个版本。
您的类对用户有足够的了解,可以调用它的方法和方法的结果,所以您的测试已经足够让这些调用按预期工作了。
你的模仿者实际上不需要制作一个假数据库,也不必有真正的功能,它只需要看起来就像真的一样。如果您只关心是否按顺序调用数据层,只需将函数链的每一步设置为true或其他内容,并在测试结束时验证所有var是否为true。不是很好,但它确保这个类按预期调用数据层。
长期而言,如果您必须继续这样做,对用户或类似类进行双重测试,根据需要添加功能。
https://stackoverflow.com/questions/58880214
复制相似问题