How to move the mock.patch to the setUp?

前端 未结 1 763
礼貌的吻别
礼貌的吻别 2021-01-06 10:05

I have the following two unit tests:

    @mock.patch(\'news.resources.generator.Generator.get_header\')
    @mock.patch(\'news.scraper.bbc_spider.BBCSpider.s         


        
相关标签:
1条回答
  • 2021-01-06 10:51

    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"

    0 讨论(0)
提交回复
热议问题