首页 > 解决方案 > 如何模拟调用存储过程(python)的功能

问题描述

我想测试调用存储过程的函数。经过研究,我发现我们可以模拟(patch)数据库操作。

我已经尝试修补与数据库的连接。

我想知道如何patch调用函数funct2 ( call Stored Procedure) 以便我可以手动给出它的输出

例如。存储过程的输出是:

data= ({'x': 13, 'y': 'san'})

这就是我的代码的样子

class db()
    def  __init__(host, user,password,dbname)
    def funct2()

 class A
    def func1(self):
        data = self.dbObj.funct2()
        # use this data to test something
         ....

dbObj=db(host, user,password, dbname)

我不想在此测试期间连接到任何数据库,想在我的 function_test( func1 )中手动提供此输出

标签: python-3.xunit-testingstored-proceduresmocking

解决方案


通常,您会接受一个数据库(或某个数据库的某种抽象)作为构造函数的参数。这样您就可以轻松地传入一个模拟对象。例如:

import unittest
from unittest import mock


class A(object):

    def __init__(self, db=None):
        self.db = db

    def func1(self):
        data = self.db.func2()
        return data


class ExampleMockingTest(unittest.TestCase):

    def test_something(self):
        mock_db = mock.MagicMock()
        mock_db.func2.return_value = {'x': 13, 'y': 'san'}

        # Pass in your mock to your object
        a = A(db=mock_db)

        # Do stuff with A...
        self.assertIn('x', a.func1())


if __name__ == '__main__':
    unittest.main()

For details on mocking in Python, see here.


推荐阅读