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.
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.
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.
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.
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With