Python unittest:如何很好地模拟Web爬虫功能?

时间:2018-03-23 01:38:28

标签: python unit-testing

我在Python中编写了一个小程序,其输出取决于几个网页的内容。我无法控制这些网页,将来可能会发生变化。因为我正在写一些测试。

我写了一个集成测试,我正在尝试编写一个def gen(): yield open("search_content.dat","rb").read() yield open("feed_content.dat","rb").read() content_generator = gen() def FakeScrapper(*args, **kwargs): return next(content_generator) ,我在其中模拟了废弃网页的功能。在我的测试中,函数被调用两次并且每次返回两个不同网页的内容。这意味着我需要使用返回两个不同内容的函数来模拟它。我是按照以下方式做的:

@patch( "http.client.HTTPResponse.read", side_effect=FakeScrapper)
def test_mockscrapper(self, *args, **kwargs):

并进一步

my_json_data

我正在使用包裹发电机的功能。它对我来说看起来很沉重和丑陋。有更多的pythonic方式吗?

1 个答案:

答案 0 :(得分:1)

您可以直接使用生成器,因为生成器是迭代器和side effect accepts an iterator

  

如果side_effect是可迭代的,那么每次调用mock都会返回   可迭代的下一个值

在你的例子中:

@patch( "http.client.HTTPResponse.read", side_effect=gen())
def test_mockscrapper(self, *args, **kwargs):

另一个简单的例子:

import os

from mock import patch,Mock

def gen():
    yield 1
    yield 2

class SimpleTest():

    @patch('os.dir', Mock(side_effect=gen()))
    def test_gen(self):
        a = os.dir()
        b = os.dir()
        assert a == 1
        assert b == 2