Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why python mock patch doesn't work?

I have two files

spike.py

class T1(object):     def foo(self, afd):         return "foo"      def get_foo(self):         return self.foo(1)   def bar():     return "bar" 

test_spike.py:

from unittest import TestCase import unittest from mock import patch, MagicMock from spike import T1, bar   class TestStuff(TestCase):     @patch('spike.T1.foo', MagicMock(return_value='patched'))     def test_foo(self):         foo = T1().get_foo()         self.assertEqual('patched', foo)      @patch('spike.bar')     def test_bar(self, mock_obj):         mock_obj.return_value = 'patched'         bar = bar()         self.assertEqual('patched', bar)   if __name__ == "__main__":     unittest.main() 

When I run python test_spike.py, the first test case would pass, but the second would fail. and I switch to use nosetests test_spike.py, then both two are failed.

I don't understand how this happened? These cases supposed to pass all.

like image 488
LeoShi Avatar asked Nov 27 '13 12:11

LeoShi


People also ask

Why patch is not working?

A common reason for this error is because the back-end data source is a table but there is no primary key or is read-only. How to fix: Ensure that the input to the Patch function is a collection. Ensure that the back-end data source table is writable and has a primary key.

What is patch in Python mock?

patch() unittest. mock provides a powerful mechanism for mocking objects, called patch() , which looks up an object in a given module and replaces that object with a Mock . Usually, you use patch() as a decorator or a context manager to provide a scope in which you will mock the target object.

How does mock in Python work?

mock is a library for testing in Python. It allows you to replace parts of your system under test with mock objects and make assertions about how they have been used. unittest. mock provides a core Mock class removing the need to create a host of stubs throughout your test suite.


1 Answers

Access bar using spike.bar. Imported bar is not affected by mock.patch.

from unittest import TestCase import unittest from mock import patch, MagicMock from spike import T1 import spike # <----   class TestShit(TestCase):     @patch('spike.T1.foo', MagicMock(return_value='patched'))     def test_foo(self):         foo = T1().get_foo()         self.assertEqual('patched', foo)      @patch('spike.bar')     def test_bar(self, mock_obj):         mock_obj.return_value = 'patched'         bar = spike.bar() # <-----         self.assertEqual('patched', bar)   if __name__ == "__main__":     unittest.main() 
like image 189
falsetru Avatar answered Sep 25 '22 15:09

falsetru