Python - исправление нескольких Mocks с несколькими возвращаемыми значениями

Поэтому я пытаюсь запустить юнит с двумя пропатченными макетами, где первый патченный макет (insertIntoParent) вызывается три раза и возвращает значения [17,18,19], Вот мой тест:

@mock.patch('dao.AccessSQLInterface.AccessSQLInterface.insertIntoParent')
@mock.patch('dao.AccessSQLInterface.AccessSQLInterface.insertBulkData')
def test_hiertablecreatebulkinsert(self, insertBulkData, insertIntoParent):
  parse = ParseWorksheet()
  dao = AccessSQLInterface()

  dao.insertIntoParent = MagicMock(side_effect=[17,18,19])

  wb = openpyxl.Workbook()
  ws = wb.create_sheet('SheetData')

  dictHier = {}
  dictHier['C1'] = 4
  dictHier['C2'] = 2

  ws['A1'].value = 'Nameheader'
  ws['C1'].value = 'Parent1'
  ws['C2'].value = 'Parent2_1'
  ws['E2'].value = 'Parent2_2'
  ws['A4'].value = 'Cat1'
  ws['A5'].value = 'Cat2'
  ws['C4'].value = 'TxtVal1'
  ws['D5'].value = 4
  ws['E5'].value = 'TxtVal6'
  ws['F4'].value = 7

  genHeader = 'INSERT INTO dbo.Tbl1(Nameheader,Header1,Header2,ParentXID,StudyXID)'

  valueString1 = "('Cat1','TxtVal1',NULL,18,1),('Cat2',NULL,4,18,1)"
  valueString2 = "('Cat1',NULL,7,19,1),('Cat2','TxtVal6',NULL,19,1)"


  parse.createHierTableInserts(1, ws, 'Tbl1', genHeader, dictHier, 'A', 'False','C4','F5',dao)


  insertIntoParent.assert_called_once()

  insertBulkData.assert_any_call(genHeader, valueString1)
  insertBulkData.assert_any_call(genHeader, valueString2)

Я знаю строчку:(dao.insertIntoParent = MagicMock(side_effect=[17,18,19])) правильно высмеивает ответы, так как значения побочных эффектов отображаются в insertBulkData.assert_any_call(genHeader, valueString[]) проверять. Тест не проходит на линии insertIntoParent.assert_called_once() говоря 'insertIntoParent был вызван 0 раз', ​​но если я закомментирую это, тест пройден. Это dao.insertIntoParent перекрывая мой insertIntoParent пропатчен макет? Как мне это настроить?

1 ответ

Решение

Так что на самом деле это было довольно легко исправить, мне просто пришлось поменять линию побочных эффектов (как я и думал, это перекрывало мой исправленный макет). Вот мой новый тест:

@mock.patch('dao.AccessSQLInterface.AccessSQLInterface.insertIntoParent')
@mock.patch('dao.AccessSQLInterface.AccessSQLInterface.insertBulkData')
def test_hiertablecreatebulkinsert(self, insertBulkData, insertIntoParent):
  parse = ParseWorksheet()
  dao = AccessSQLInterface()

  insertIntoParent.side_effect=[1,2,3]

  wb = openpyxl.Workbook()
  ws = wb.create_sheet('SheetData')

  dictHier = {}
  dictHier['C1'] = 4
  dictHier['C2'] = 2

  ws['A1'].value = 'Nameheader'
  ws['C1'].value = 'Parent1'
  ws['C2'].value = 'Parent2_1'
  ws['E2'].value = 'Parent2_2'
  ws['A4'].value = 'Cat1'
  ws['A5'].value = 'Cat2'
  ws['C4'].value = 'TxtVal1'
  ws['D5'].value = 4
  ws['E5'].value = 'TxtVal6'
  ws['F4'].value = 7

  genHeader = 'INSERT INTO dbo.Tbl1(Nameheader,Header1,Header2,ParentXID,StudyXID)'

  valueString1 = "('Cat1','TxtVal1',NULL,2,1),('Cat2',NULL,4,2,1)"
  valueString2 = "('Cat1',NULL,7,3,1),('Cat2','TxtVal6',NULL,3,1)"

  parse.createHierTableInserts(1, ws, 'Tbl1', genHeader, dictHier, 'A', 'False','C4','F5',dao)

  insertIntoParent.assert_any_call('Parent1',mock.ANY,'C1','Tbl1','NULL')
  insertIntoParent.assert_any_call('Parent2_1',mock.ANY,'C2','Tbl1',1)
  insertIntoParent.assert_any_call('Parent2_2',mock.ANY,'E2','Tbl1',1)

  insertBulkData.assert_any_call(genHeader, valueString1)
  insertBulkData.assert_any_call(genHeader, valueString2)
Другие вопросы по тегам