2016-07-28 1 views
0

私はユニットテストが必要な以下の機能を持っています。オブジェクト属性と複雑なフィールドとメソッドをモックする方法は?

def read_all_fields(all_fields_sheet): 
    entries = [] 

    for row_index in xrange(2, all_fields_sheet.nrows): 
     d = {'size' : all_fields_sheet.cell(row_index,0).value,\ 
      'type' : all_fields_sheet.cell(row_index,1).value,\ 
      'hotslide' : all_fields_sheet.cell(row_index,3).value} 
     entries.append((all_fields_sheet.cell(row_index,2).value,d)) 

    return entries 

ここで、my_fields_sheetは、xlrdモジュールから返されたシートです(Excelファイルの読み込みに使用されます)。

だから、基本的に私は次のために模擬する必要が NROWS セル

は、どのように私はそれabput行くべき属性?

答えて

1

モックオブジェクトの呼び出しと属性を直接モックします。テストのニーズをカバーするために調整します

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()が呼び出されるたびに呼び出されます。

関連する問題