モックオブジェクトの呼び出しと属性を直接モックします。テストのニーズをカバーするために調整します
mock_sheet = MagicMock()
mock_sheet.nrows = 3 # loop once
cells = [
MagicMock(value=42), # row_index, 0
MagicMock(value='foo'), # row_index, 1
MagicMock(value='bar'), # row_index, 3
MagicMock(value='spam'), # row_index, 2
]
mock_sheet.cell.side_effect = cells
Mock.side_effect
にリストを割り当てることによって、あなたは.cell()
リターンを呼ぶもの、順番に、制御することができます。
その後、適切な呼び出しがさまざまなアサーションメソッドで行われたかどうかをテストできます。あなたは、正確な期待を与えることmock.call()
objectを使用することができます。
result = read_all_fields(mock_sheet)
self.assertEqual(
result,
[('spam', {'size': 42, 'type': 'foo', 'hotslide': 'bar'})]
)
self.assertEqual(
mock_sheet.cell.call_args_list,
[call(2, 0), call(2, 1), call(2, 3), call(2, 2)])
私が直接、一人でmock_sheet.cell
に、呼び出しの正確な数と一致するように、ここでMock.call_args_list
を使用しました。あなたのread_all_fields()
機能がすでに定義されていることを想定し
デモ、:
>>> from unittest.mock import MagicMock, call
>>> mock_sheet = MagicMock()
>>> mock_sheet.nrows = 3 # loop once
>>> cells = [
... MagicMock(value=42), # row_index, 0
... MagicMock(value='foo'), # row_index, 1
... MagicMock(value='bar'), # row_index, 3
... MagicMock(value='spam'), # row_index, 2
... ]
>>> mock_sheet.cell.side_effect = cells
>>> result = read_all_fields(mock_sheet)
>>> result == [('spam', {'size': 42, 'type': 'foo', 'hotslide': 'bar'})]
True
>>> mock_sheet.cell.call_args_list == [call(2, 0), call(2, 1), call(2, 3), call(2, 2)]
True
代わりに、あなたが前もって設定「シート」から値を返すために、mock_sheet.cell.side_effect
属性の機能を作成することができます。
cells = [[42, 'foo', 'spam', 'bar']] # 1 row
def mock_cells(row, cell):
return MagicMock(value=cells[row - 2][cell])
mock_sheet.cell.side_effect = mock_cells
side_effect
が関数の場合、同じ引数でmock_sheet.cell()
が呼び出されるたびに呼び出されます。