51

I tried patching a provider class by decorating a test method with @patch:

class TestMyUnit(unittest.TestCase):
...
@patch(provider.Provider,autospec=True)
def test_init(self, mock_provider):
    pass

However, when I run the test, I get the error:

*@patch(provider.Provider)*  
*File "build\bdist.win32\egg\mock.py", line 1518, in patch*  
*getter, attribute = \_get\_target(target)*  
*File "build\bdist.win32\egg\mock.py", line 1367, in \_get\_target*  
*target, attribute = target.rsplit('.', 1)*  
*AttributeError: class Provider has no attribute 'rsplit'*  
*ERROR: Module: test\_my\_unit could not be imported (file: C:\dev\src\test\_my\_unit.py).*

Any ideas?

General Grievance
  • 4,555
  • 31
  • 31
  • 45
bavaza
  • 10,319
  • 10
  • 64
  • 103

2 Answers2

77

Use a string instead of the class.

@patch('provider.Provider', autospec=True)
def test_init(self, mock_provider):
    pass
XORcist
  • 4,288
  • 24
  • 32
0

Te actual solution for your answer is that you have to use patch.object if you are using the imported class.

These two are the same

@patch.object(provider.Provider, autospec=True)
def test_init(self, mock_provider):
    pass

@patch('provider.Provider', autospec=True)
def test_init(self, mock_provider):
    pass

Which one to choose?

If you already have the imported class, you can use it, it is more readable. If you have to import it to patch it, then use a string

Gonzalo
  • 752
  • 8
  • 23