2016-07-14 7 views
0

Ich denke, das sollte ein einfacher Schein sein, aber ich habe es noch nicht zum Laufen gebracht.Funktionspatch wird nicht von importiertem Modul übernommen

Ich arbeite der folgenden Verzeichnisstruktur aus:

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

Der entsprechende Code ist wie folgt:

- utilities.py -

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

- bestellen. 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) 

Dies ist das erste Mal, dass ich versucht habe, in Python zu spotten. Von dem, was ich sagen kann, was ich habe, sollte funktionieren, aber immer wenn Orderget_file_path ruft, verwendet es immer das in utilities.py.

Ich habe versucht:

  • test_load_order_by_number Dekoration
  • Patchen mit module.order.get_file_path

Ich habe versucht der Suche auf SO, aber keine der Lösungen, die ich half gefunden, so dass ich dachte, dass ich nur etwas offensichtlich falsch machen, dass jemand darauf hinweisen kann.

Antwort

0

Es sieht nicht so aus, als ob der Patch außerhalb der Klasse erstellt wurde. Es fing an zu arbeiten, als ich den Patch als Dekorateur für den spezifischen Test zog.

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)