I have the following two unit tests:
@mock.patch(\'news.resources.generator.Generator.get_header\')
@mock.patch(\'news.scraper.bbc_spider.BBCSpider.s
You have 2 options here -- First, you could move the patching to the class:
@mock.patch('news.resources.generator.Generator.get_header')
@mock.patch('news.scraper.bbc_spider.BBCSpider.save_scraped_rss_into_news_model')
@mock.patch('news.scraper.bbc_spider.BBCSpider.get_news_urls')
@mock.patch('requests.get')
class TestGenerator(TestBase):
def test_get_header_is_called(self, req_get, spi_news, spi_save_rss, get_head):
pass
when you use something in the mock.patch
family on the class, it behaves as if you had patched each method that starts with "test"1 individually.
Your other option is to start the patches in setup. In a fictitious example (to save typing), it looks like this:
class SomeTest(TestCase):
def setUp(self):
super(SomeTest, self).setUp()
patch = mock.patch('foo.bar.baz')
mock_baz = patch.start() # may want to keep a reference to this if you need to do per-test configuration
self.addCleanup(patch.stop)
addCleanup
was added in python2.7 (and is fantastic!). If you don't need older versions of python2.x, you should use it as it is more robust than the alternatives. The easiest alternative is to just stop all patches in tearDown:
class SomeTest(TestCase):
def setUp(self):
super(SomeTest, self).setUp()
patch = mock.patch('foo.bar.baz')
mock_baz = patch.start() # may want to keep a reference to this if you need to do per-test configuration
def tearDown(self):
super(SomeTest, self).tearDown()
mock.patch.stopall()
but you can also keep references to individual patches self.patch1 = mock.patch(...)
and then stop that one individually in tearDown
as necessary.
1Actually, mock.TEST_PREFIX
which defaults to "test"