Ik ben bezig met een projectje waarin ik Excel bestanden lees via Python 3.6 met xlwings. Ik wil graag meer leren van TDD en wil dat deze tests kunnen draaien zonder Excelbestanden te hoeven openen d.m.v. mocks.
Dit werkt:
Maar het testen geeft me niet het gewenste resultaat:
Ik zou graag de waarde 'x' zien i.p.v. de <MagicMock>. Een 'normale' functie mocken lukt me wel, maar xlwings maakt het wat complexer met de workbooks, sheets en value attributes.
Voor m'n gevoel zit ik er heel dicht bij, maar mis ik net even het laatste stukje. Heeft iemand een hint?
Alvast bedankt!
Dit werkt:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| from unittest import mock import xlwings as xw def read_content(filename, sheet_name, cell): """Opens Excel file and returns the content of 'cell' in 'sheet_name'""" app = xw.App(visible=False) wb = xw.Book(filename, read_only=True) ws = wb.sheets[sheet_name] val = ws[cell].value try: app.quit() except: pass return val print(f'Real call: {read_content(r"Tests/Sample Excel file.xlsx", "Sheet1", "A1")}') # Real call: actual content of cell A1 |
Maar het testen geeft me niet het gewenste resultaat:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
| @mock.patch("xlwings.Book") @mock.patch("xlwings.App") def test_read_content(patched_app, patched_book): patched_app.return_value = None patched_book.sheets["some_sheet"].return_value["A1"].value.return_value = "x" print(f'Mocked call: {read_content("something.xlsx", "some_sheet", "A1")}') test_read_content() ### Returns: # Mocked call: <MagicMock name='Book().sheets.__getitem__().__getitem__().value' id='19605530263104'> ### Expected: # Mocked call: x |
Ik zou graag de waarde 'x' zien i.p.v. de <MagicMock>. Een 'normale' functie mocken lukt me wel, maar xlwings maakt het wat complexer met de workbooks, sheets en value attributes.
Voor m'n gevoel zit ik er heel dicht bij, maar mis ik net even het laatste stukje. Heeft iemand een hint?
Alvast bedankt!