Pytest 在文件打开命令字符串断言上失败 - 测试它的最佳方法是什么?



我正在构造一个命令来传递给请求库以发布附件 - 如 files= 附件 = {"附件": ("image.png",open("C:\tmp\sensor.png", "rb"(, "image/png"(}

代码正在工作,但我无法让 PyTest 按 -is 测试它,因为在评估时会执行打开命令。 这是问题的简化代码

import pytest
def openfile():
cmd = {"cmd": open(r"C:tmpsensor.png")}
return cmd

def test_openfile():
cmd = openfile()
#assert str(cmd) == str({"cmd": open(r"C:tmpsensor.png")})  # this works
assert cmd == {"cmd": open(r"C:tmpsensor.png")}            # this does not

PyTest 抱怨双方是不同的,但随后在差异面板中确认它们是相同的!

预期 :{'cmd': <_io.TextIOWrapper name='C:\tmp\sensor.png' mode='r' encoding='cp1252'>}

实际 :{'cmd': <_io.TextIOWrapper name='C:\tmp\sensor.png' mode='r' encoding='cp1252'>}

"点击查看差异" - 打开差异面板报告"内容相同"!

我可以坚持将生成的字符串与预期的字符串进行比较,但我想知道是否有更好的方法来做到这一点。 想法?

您需要测试由 open 调用返回的实际文件缓冲区的属性,而不是对该缓冲区的引用,例如:

def test_openfile():
cmd = openfile()
expected_filename = r"C:tmpsensor.png"
assert "cmd" in cmd
file_cmd = cmd["cmd"]
assert file_cmd.name == expected_filename
with open(expected_filename) as f:
contents = f.read()
assert file_cmd.read() == contents

请注意,在测试中,您可能没有文件内容,或者将它们放在另一个位置(如夹具(,因此测试文件内容可能必须进行调整,或者可能不需要,具体取决于您要测试的内容。

在与朋友讨论这个问题之后,我认为我原来的方法完全有效。对于任何绊倒这个问题的人,原因如下:

我正在尝试对可执行参数的构建进行 pytest 构建,以传递给另一个库执行。参数的执行无关紧要,只是格式正确。测试是将生成的内容与预期的参数进行比较(就好像我输入了它一样(。 因此,转换为字符串或 json 并进行比较是合适的,因为这是人类手动检查代码的方式!

最新更新