在脚本开头,我使用platform.system
和platform.release
来确定脚本运行的操作系统和版本(因此它知道它的数据在Mac上的应用程序支持中) ,家用unix-like和non-mac unix,appdata on windows< = XP,appdata / roaming on windows> = Vista)。我想测试一系列if
s,elif
和else
s确定操作系统和发行版的内容,但我只能访问Mac 10.6.7,一些未知版本的Linux和Windows 7.有没有办法提供platform
虚假系统和发布信息,以便我可以确定XP,Solaris等能够在没有安装的情况下正确处理脚本?
答案 0 :(得分:2)
也许像
>>> platform.system = lambda: "whatever"
>>> platform.system()
'whatever'
答案 1 :(得分:1)
您可能想要探索mocking platform
进行测试。或者,您可以直接使用补丁platform
,甚至直接使用sys.modules
来覆盖默认的platform
模块,但是mock已经设计为自包含且具有漂亮的好处在您的代码中清楚地显示什么是测试工具,哪些不是测试工具,因此您不会意外地在生产代码中发布测试功能。
答案 2 :(得分:1)
您可以创建初始化函数以将这些变量作为参数,以便在测试中很容易欺骗它们
答案 3 :(得分:0)
对我来说,直接用 pytest-mock 修补 platform.system
不起作用。不过,一个简单的技巧是在您自己的实用程序函数中抽象此信息的检索(这次您可以使用 pytest-mock 成功修补)。
因此,在您的实现模块/类中:
def _get_system() -> str:
return platform.system().lower()
def _is_windows() -> bool:
return _get_system() == 'windows'
在你的测试中,这里使用 pytest + pytest-mock:
def test_win_no_pad_code():
with patch('module_name._get_system', MagicMock(return_value='windows')):
assert module_name._is_windows()
这是使用模块的一种方式,但您可以使用类来代替。