我正在编写几个 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/