Python单元测试:如何很好地模拟web爬虫函数?
我用Python编写了一个小程序,其输出取决于几个网页的内容。我无法控制这些网页,将来可能会改变。所以我写了一些测试 我编写了一个集成测试,我正在尝试编写一个Python单元测试:如何很好地模拟web爬虫函数?,python,unit-testing,Python,Unit Testing,我用Python编写了一个小程序,其输出取决于几个网页的内容。我无法控制这些网页,将来可能会改变。所以我写了一些测试 我编写了一个集成测试,我正在尝试编写一个unittest,其中我模拟了取消网页的功能。在我的测试中,函数被调用两次,每次返回两个不同网页的内容。这意味着我需要用一个返回两个不同内容的函数来模拟它。我是这样做的: def gen(): yield open("search_content.dat","rb").read() yield open("feed_cont
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
行下,只要你能控制你读取的文件,那就太棒了!非常感谢。我不知道副作用可能是发电机。良好的设计灵活性。