Python单元测试:如何很好地模拟web爬虫函数?

Python单元测试:如何很好地模拟web爬虫函数?,python,unit-testing,Python,Unit Testing,我用Python编写了一个小程序,其输出取决于几个网页的内容。我无法控制这些网页,将来可能会改变。所以我写了一些测试 我编写了一个集成测试,我正在尝试编写一个unittest,其中我模拟了取消网页的功能。在我的测试中,函数被调用两次,每次返回两个不同网页的内容。这意味着我需要用一个返回两个不同内容的函数来模拟它。我是这样做的: def gen(): yield open("search_content.dat","rb").read() yield open("feed_cont

我用Python编写了一个小程序,其输出取决于几个网页的内容。我无法控制这些网页,将来可能会改变。所以我写了一些测试

我编写了一个集成测试,我正在尝试编写一个
unittest
,其中我模拟了取消网页的功能。在我的测试中,函数被调用两次,每次返回两个不同网页的内容。这意味着我需要用一个返回两个不同内容的函数来模拟它。我是这样做的:

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):

我正在使用一个函数包装一个生成器。我觉得它很重,很难看。有没有一种更符合python的方法呢?

您可以直接使用生成器,因为生成器是迭代器,并且:

如果side_effect是一个iterable,那么每个对mock的调用都将返回 iterable中的下一个值

在您的示例中:

@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

它应该是
def test\u mockscraser(self,mock\u read)
给我在
@patch
行下,只要你能控制你读取的文件,那就太棒了!非常感谢。我不知道副作用可能是发电机。良好的设计灵活性。