pym*_*mat 7 python export-to-csv pandas python-unittest
mymodule.py
def write_df_to_csv(self, df, modified_fn):
new_csv = self.path + "/" + modified_fn
df.to_csv(new_csv, sep=";", encoding='utf-8', index=False)
Run Code Online (Sandbox Code Playgroud)
test_mymodule.py
class TestMyModule(unittest.TestCase):
def setUp(self):
args = parse_args(["-f", "test1"])
self.mm = MyModule(args)
self.mm.path = "Random/path"
self.test_df = pd.DataFrame(
[
["bob", "a"],
["sue", "b"],
["sue", "c"],
["joe", "c"],
["bill", "d"],
["max", "b"],
],
columns=["A", "B"],
)
def test_write_df_to_csv(self):
to_csv_mock = mock.MagicMock()
with mock.patch("project.mymodule.to_csv", to_csv_mock, create=True):
self.mm.write_df_to_csv(self.test_df, "Stuff.csv")
to_csv_mock.assert_called_with(self.mm.path + "/" + "Stuff.csv")
Run Code Online (Sandbox Code Playgroud)
当我运行这个测试时,我得到:
FileNotFoundError: [Errno 2] No such file or directory: 'Random/path/Stuff.csv'
Run Code Online (Sandbox Code Playgroud)
我试图to_csv用我的方法来嘲笑。我的其他测试按预期运行,但是我不确定这个测试出了什么问题。我对 MagicMock 的使用是否正确,还是我忽略了其他内容?
小智 5
另一种方法是
import unittest.mock as mock
import unittest
import pandas as pd
import project.mymodule as mm
class TestMyModule(unittest.TestCase):
def test_write_df_to_csv(self):
test_df = pd.DataFrame(...)
with mock.patch("pandas.DataFrame.to_csv") as to_csv_mock:
mm.write_df_to_csv(test_df, "Stuff.csv")
to_csv_mock.assert_called_with("Stuff.csv")
if __name__ == '__main__':
unittest.main()'''
Run Code Online (Sandbox Code Playgroud)
您没有提供最小的、可重现的示例,因此我必须删除一些内容才能完成这项工作。我想你可以自己填写缺失的部分。
一个问题是mock.patch("project.mymodule.to_csv", ...)它试图模拟导入路径中模块中命名的类。这只是“有效”,因为你通过了,但是当然,嘲笑以前不存在的东西没有任何效果,因为没有人会调用它。to_csvproject.mymodulecreate=True
您可以使用模拟整个DataFrame课程mock.patch("pandas.DataFrame", ...)。注意:这pd与您如何(甚至是否)导入pandas当前模块无关。
但是,随后您的单元测试将断言该方法是在任何to_csv对象上调用的,而不一定是您传入的对象。通过仅模拟我们要传入的一个对象上的方法,测试会变得更加全面,也更容易理解。我们可以使用 来做到这一点。 DataFrameto_csvDataFramewrite_df_to_csvmock.patch.object
mock.patch.object返回模拟函数,我们随后可以在其上调用断言。因为它是一个方法模拟,而不是一个自由函数,所以我们不需要self在断言中传递参数。
项目/mymodule.py
def write_df_to_csv(df, file_name):
df.to_csv(file_name, sep=";", encoding='utf-8', index=False)
Run Code Online (Sandbox Code Playgroud)
项目/test_mymodule.py
import unittest.mock as mock
import unittest
import pandas as pd
import project.mymodule as mm
class TestMyModule(unittest.TestCase):
def test_write_df_to_csv(self):
test_df = pd.DataFrame(...)
with mock.patch.object(test_df, "to_csv") as to_csv_mock:
mm.write_df_to_csv(test_df, "Stuff.csv")
to_csv_mock.assert_called_with("Stuff.csv")
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
输出
现在测试以正确的方式失败了,因为参数实际上并不匹配!
$ python -m project.test_mymodule
F
======================================================================
FAIL: test_write_df_to_csv (__main__.TestMyModule)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/project/test_mymodule.py", line 25, in test_write_df_to_csv
to_csv_mock.assert_called_with("Stuff.csv")
File "/usr/lib/python3.8/unittest/mock.py", line 913, in assert_called_with
raise AssertionError(_error_message()) from cause
AssertionError: expected call not found.
Expected: to_csv('Stuff.csv')
Actual: to_csv('Stuff.csv', sep=';', encoding='utf-8', index=False)
----------------------------------------------------------------------
Ran 1 test in 0.003s
FAILED (failures=1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12498 次 |
| 最近记录: |