Python - 用多个 Return 值修补多个模拟
Python - Patch Multiple Mocks with Multiple Return Values
所以我正在尝试 运行 一个带有两个补丁模拟的单元,其中第一个补丁模拟 (insertIntoParent
) 被调用三次并且 returns [=14] 的值=].这是我的测试:
@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 was called 0 times' 上失败,但如果我将其注释掉,则测试通过。 dao.insertIntoParent
是否覆盖了我的 insertIntoParent
补丁模拟?我应该如何设置?
所以实际上这是一个非常简单的修复,我只需要更改副作用线(正如我所想的那样,它覆盖了我的补丁模拟)。这是我的新测试:
@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)
所以我正在尝试 运行 一个带有两个补丁模拟的单元,其中第一个补丁模拟 (insertIntoParent
) 被调用三次并且 returns [=14] 的值=].这是我的测试:
@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 was called 0 times' 上失败,但如果我将其注释掉,则测试通过。 dao.insertIntoParent
是否覆盖了我的 insertIntoParent
补丁模拟?我应该如何设置?
所以实际上这是一个非常简单的修复,我只需要更改副作用线(正如我所想的那样,它覆盖了我的补丁模拟)。这是我的新测试:
@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)