如何 mock.patch python 中的普通字典?
How to mock.patch a plain dictionary in python?
如何 mock.patch 普通字典 {}?
我想检查 headers 是否设置为 {'Content-Type': 'application/json'}。
def get(self):
result = Spider.get_news_urls()
for k, v in result.iteritems():
response = requests.get(v)
xml = response.text()
headers = {'Content-Type': 'application/json'}
data = ''
taskqueue.Task(url='/v1/worker', headers=headers, payload=json.dumps(data)).add(queue_name='itagnewstasks')
return 'success', 200
下面的单元测试好像成功给dict打补丁了。但是我有一个 {},我需要对其进行修补。
@mock.patch('__builtin__.dict')
@mock.patch('requests.get')
def test_header_is_set_to_json(self, req_get, x):
gen = Generator()
gen.get()
x.assert_called_with()
我想另一种方法是模拟补丁 taskqueue.Task()
并比较它是否以 headers= {'Content-Type': 'application/json'}
作为参数调用。
您要模拟的 header 是在您正在测试的方法中构建的,因此模拟 taskqueue.Task
调用会容易得多。如果您将 header 字典传递给该方法,那么您可以保留一份副本并检查它是否已按预期更新。
您可以使用 patch.dict 模拟字典:
>>> foo = {}
>>> with patch.dict(foo, {'newkey': 'newvalue'}):
... assert foo == {'newkey': 'newvalue'}
...
>>> assert foo == {}
运行 今天 patch.dict
的一个问题。
patch.dict
回滚 __exit__
处的整个字典...而不仅仅是修补后的值。如果这不是您想要的行为,您可能需要使用更具选择性的修补程序。
这与 patch.dict
的工作原理相同,但它只会恢复您修补的密钥。
class DictPatch:
def __init__(self, obj, patch):
self.obj = obj
self.patch = patch
self.save = {}
self.pop = []
def start(self):
self.save = {k: v for k, v in self.obj.items() if k in self.patch}
self.pop = [k for k in self.patch if k not in self.obj]
self.obj.update(self.patch)
# this allows you to do self.addCleanup(DictPatch(...)), which is nice
return self.stop
def stop(self):
self.obj.update(self.save)
for k in self.pop:
self.obj.pop(k)
def __enter__(self):
self.start()
def __exit__(self, exc_type, exc_val, exc_tb):
self.stop()
如何 mock.patch 普通字典 {}?
我想检查 headers 是否设置为 {'Content-Type': 'application/json'}。
def get(self):
result = Spider.get_news_urls()
for k, v in result.iteritems():
response = requests.get(v)
xml = response.text()
headers = {'Content-Type': 'application/json'}
data = ''
taskqueue.Task(url='/v1/worker', headers=headers, payload=json.dumps(data)).add(queue_name='itagnewstasks')
return 'success', 200
下面的单元测试好像成功给dict打补丁了。但是我有一个 {},我需要对其进行修补。
@mock.patch('__builtin__.dict')
@mock.patch('requests.get')
def test_header_is_set_to_json(self, req_get, x):
gen = Generator()
gen.get()
x.assert_called_with()
我想另一种方法是模拟补丁 taskqueue.Task()
并比较它是否以 headers= {'Content-Type': 'application/json'}
作为参数调用。
您要模拟的 header 是在您正在测试的方法中构建的,因此模拟 taskqueue.Task
调用会容易得多。如果您将 header 字典传递给该方法,那么您可以保留一份副本并检查它是否已按预期更新。
您可以使用 patch.dict 模拟字典:
>>> foo = {}
>>> with patch.dict(foo, {'newkey': 'newvalue'}):
... assert foo == {'newkey': 'newvalue'}
...
>>> assert foo == {}
运行 今天 patch.dict
的一个问题。
patch.dict
回滚 __exit__
处的整个字典...而不仅仅是修补后的值。如果这不是您想要的行为,您可能需要使用更具选择性的修补程序。
这与 patch.dict
的工作原理相同,但它只会恢复您修补的密钥。
class DictPatch:
def __init__(self, obj, patch):
self.obj = obj
self.patch = patch
self.save = {}
self.pop = []
def start(self):
self.save = {k: v for k, v in self.obj.items() if k in self.patch}
self.pop = [k for k in self.patch if k not in self.obj]
self.obj.update(self.patch)
# this allows you to do self.addCleanup(DictPatch(...)), which is nice
return self.stop
def stop(self):
self.obj.update(self.save)
for k in self.pop:
self.obj.pop(k)
def __enter__(self):
self.start()
def __exit__(self, exc_type, exc_val, exc_tb):
self.stop()