简体   繁体   English

如何将mock.patch移到setUp?

[英]How to move the mock.patch to the setUp?

I have the following two unit tests: 我有以下两个单元测试:

    @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')
    def test_get_header_is_called(self, req_get, spi_news, spi_save_rss, get_head):
        spi_news.return_value = {'x': 1}
        gen = Generator()
        gen.get()
        get_head.assert_called_with()

    @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')
    def test_task_url_is_save_scraped_rss_into_news_model(self, req_get, spi_news, spi_save_rss, get_head):
        spi_news.return_value = {'x': 1}
        gen = Generator()
        gen.get()
        tasks = self.taskqueue_stub.GetTasks("newstasks")
        self.assertEqual(tasks[0]['url'], '/v1/worker/save-scraped-rss-into-news-model')

As you can see there is a lot of code repetition. 如您所见,有很多代码重复。 Is there a way I could move the mock.patch to the setUp()? 有没有一种方法可以将模拟文件.patch移到setUp()?

Class TestGenerator(TestBase):
    def setUp(self):
        super(TestGenerator, self).setUp()
        mock.patch() ???

    def test_get_header_is_called(self, req_get, spi_news, spi_save_rss, get_head):
            spi_news.return_value = {'x': 1}
            gen = Generator()
            gen.get()
            get_head.assert_called_with()

    def test_task_url_is_save_scraped_rss_into_news_model(self, req_get, spi_news, spi_save_rss, get_head):
            spi_news.return_value = {'x': 1}
            gen = Generator()
            gen.get()
            tasks = self.taskqueue_stub.GetTasks("newstasks")
            self.assertEqual(tasks[0]['url'], '/v1/worker/save-scraped-rss-into-news-model')

You have 2 options here -- First, you could move the patching to the class: 您在这里有2个选项-首先,您可以将补丁移至该类:

@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. 当您在类的mock.patch家族中使用某些东西时,它的行为就像您分别修补了以“ test” 1开头的每个方法一样。

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!). addCleanup是在python2.7中添加的(太棒了!)。 If you don't need older versions of python2.x, you should use it as it is more robust than the alternatives. 如果您不需要较旧的python2.x版本,则应使用它,因为它比其他版本更健壮。 The easiest alternative is to just stop all patches in tearDown: 最简单的选择是仅停止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. 但您也可以保留对各个修补程序的引用self.patch1 = mock.patch(...) ,然后根据需要在tearDown单独停止该修补程序。

1 Actually, mock.TEST_PREFIX which defaults to "test" 1实际上, mock.TEST_PREFIX默认为"test"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM