python - 如何构建Python模块以使其既可扩展又可测试?

标签 python unit-testing module structure

我正在编写几个 Python 模块,用于我自己处理加密货币的应用程序中。许多函数根据给定的字符串返回一些内容:

def doStuff(coin, value):
    if coin == 'BTC':
        return doSomethingWithBTC(value, 'some_string')
    elif coin == 'LTC':
        return someModule.doLTC(value, 1)
    elif coin == 'DOGE':
        return otherMod.DOGE(value, 52, True)
    else:
        return 'Some terrible error occurred.'

如您所见, key 是一组预定义的字符串(加密货币)之一。目前这个系列有三个,但我想将来扩展这个数量。我在这个模块中还有十几个函数,目前它们都采用相同的三个字符串,但是当我添加一个时,所有函数都需要扩展。

我已经对该模块进行了单元测试,现在我想测试所有函数是否能够将集合中的所有(当前为 3)项作为键。我可以通过调用它们来做到这一点,但其中一些所做的事情我无法在单元测试中真正测试。例如,其中之一进行(比特币)支付。

我现在考虑使用检查模块来获取函数的源代码,并查看它是否包含包含 key == 'X' 的行,其中 X 是前一个项目中的每个项目定义的集合。虽然我猜这会起作用,但对我来说听起来不太 Pythonic。

有谁知道我如何制作这些函数,以便我可以测试它们是否能够处理预定义集中的所有货币,而无需实际调用这些函数?欢迎所有提示!

最佳答案

使用 if-cascades 也不是很 Pythonic。如果每个键有很多方法,只需使用类并通过字典访问它们:

class BTC(object):
    def do_stuff(self, value):
        return doSomethingWithBTC(value, 'some_string')

class LTC(object):
    ...

CURRENCIE_INSTANCES = {
    'BTC': BTC(),
    'LTC': LTC(),
}

def do_stuff(key, value):
    return CURRENCIE_INSTANCES[key].do_stuff(value)

这样,您就不必更改您的 stuff-methods,而只需更改一本字典。

关于python - 如何构建Python模块以使其既可扩展又可测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24350275/

相关文章:

npm - 什么时候应该使用 npm install vs npm i

Python:用整数扩展变量字符串

python - 如何直接从命令行登录应用程序,即通过在 Pytest 的命令行中提供 URL、用户名、密码

c# - 像在 WebOperationContext 中一样在模拟 WebOperationContext 中执行 CreateTextResponse(...)

.net - 使用 ServiceHost 在单元测试中托管 WCF 服务

maven - 查找多模块 Maven Reactor 项目的根目录

Python Flask 服务器出现 'code 400' 错误(从 Telegram-webhook 发送的 POST 请求)

python - 如何用Qt设计倒计时

python - Django:测试抽象模型

.net - 什么是 Powershell(dotnet global)