我在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方式吗?
答案 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