gpt4 book ai didi

testing - 在编写单元测试时,我应该如何处理函数中的外部依赖?

转载 作者:行者123 更新时间:2023-11-28 21:10:06 26 4
gpt4 key购买 nike

以下函数遍历文件系统中目录的名称,如果它们不在其中,则将这些名称作为记录添加到数据库表中。 (请注意这个问题适用于大多数语言)。

def find_new_dirs():
dirs_listed_in_db = get_dirs_in_db()

new_dirs = []
for dir in get_directories_in_our_path():
if dir not in dirs_listed_in_db:
new_dirs.append(dir)

return new_dirs

我想为这个功能写一个单元测试。但是,该功能依赖于外部组件——数据库。那么这个测试应该怎么写呢?

我假设我应该“模拟”数据库。这是否意味着我应该像这样将函数 get_dirs_in_db 作为参数?

def find_new_dirs(get_dirs_in_db):
dirs_listed_in_db = get_dirs_in_db()

new_dirs = []
for dir in get_directories_in_our_path():
if dir not in dirs_listed_in_db:
new_dirs.append(dir)

return new_dirs

或者可能是这样?

def find_new_dirs(db):
dirs_listed_in_db = db.get_dirs()

new_dirs = []
for dir in get_directories_in_our_path():
if dir not in dirs_listed_in_db:
new_dirs.append(dir)

return new_dirs

或者我应该采取不同的方法吗?

此外,我应该从一开始就以这种方式设计我的整个项目吗?或者我应该在编写测试时需要时将它们重构为这种设计吗?

最佳答案

您所描述的称为依赖注入(inject),是的,这是一种编写可测试代码的常用方法。您概述的第二种方法(您将在其中传递数据库)可能更常见。此外,您可以让函数的 db 参数采用默认值,这样您就可以仅在测试用例中指定模拟数据库。

是否在一开始就以这种方式编写代码或稍后修改它是一个见仁见智的问题,但如果您坚持测试驱动开发 (TDD) 方法,那么您将编写您的代码无论如何,在你的被测代码之前进行测试。

还有其他方法可以解决此问题,但此时您问的是一个宽泛的问题。

关于testing - 在编写单元测试时,我应该如何处理函数中的外部依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34552390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com