导入的模块没有拾取功能补丁

时间:2016-07-14 21:41:03

标签: python unit-testing python-3.x mocking

我觉得这应该是一个简单的模拟,但我还没有让它工作。

我正在使用以下目录结构:

module
├── utilities.py
├── order.py
├── test
│   ├── test_order.py

相关代码如下:

- utilities.py -

def get_file_path(order_number, file_extension):
    # this is what I want to mock out

- order.py -

from module.utilities import get_file_path

class Order():
    # ...

    @classmethod
    def load_order(order_number, extension):
        file_path = get_file_path(order_number, extension)

- test_order.py -

import unittest
from unittest.mock import patch
from module.order import order

@patch('order.get_file_path')
def mock_file(_, extension):
    if extension == 'json':
        return static_file_path

class TestOrder(unittest.TestCase):
    def test_load_order_by_number(self):
        my_order = order.load_order(number, extension)

这是我第一次尝试使用Python进行模拟。据我所知,我的工作应该有效,但每当Order来电get_file_path时,它总是使用utilities.py中的那个。

我试过了:

  • 装饰test_load_order_by_number
  • 使用module.order.get_file_path
  • 进行修补

我试着查看SO但是我发现的解决方案都没有帮助,所以我认为我只是做了一些明显错误的事情,有人可以指出。

1 个答案:

答案 0 :(得分:0)

看起来在课堂之外创建补丁并没有被拾起。当我将补丁作为特定测试的装饰器拉出来时,它开始工作。

class TestOrder(unittest.TestCase):

    @patch('utilities.order.get_file_path')
    def test_load_order_by_number(self, file_mock):

        def mock_get_file_path(*args, **kwargs):
            if kwargs.get('extension', None) == 'json':
                return static_file_path
            return None

        file_mock.side_effect = mock_get_file_path

        my_order = order.load_order(number, extension)