我有一个类QueryBuilder
,它将消息build
发送到另一个类Query
的实例。发送该消息的方法称为build_query
。出于此问题的目的,我只关注QueryBuilder
向Query
的{{1}}方法发送的值。
我对build
的测试断言,对QueryBuilder
排序的每组“分组参数”调用Query
build
方法一次。
QueryBuilder
以下是def test_groups_queries_based_on_config(self):
params = {'metatag_attr': 'name', 'metatag_val': 'description', 'robots': True}
with patch.object(Query, 'build') as mock_query_build:
self.query_builder.build_queries(params)
calls = [call({'metatag_attr': 'name', 'metatag_val': 'description'}),
call({'robots': True})]
mock_query_build.assert_has_calls(calls)
的代码。
QueryBuilder
一些私人方法和公共财产被遗漏了,因为我认为它们不属于这个问题。
问题在于我将此行添加到class QueryBuilder(object):
def __init__(self, config=None):
self._queries = []
self._collected_params = None
self._config = config or {}
...
def build_queries(self, params):
# should return an iterator of built queries
self._collected_params = params
for param_set in self._group_params():
query = self.build_query(param_set)
self._append_query(query)
return self._queries
def build_query(self, param_set):
query = self._new_query()
return query.build(param_set)
### Private ###
def _new_query(self):
return Query(shortcuts=self.shortcuts, option_groups=self.options)
def _append_query(self, query):
valid_query = {k: v for k, v in query.items() if not k == 'seo_attr'}
if not valid_query:
return
self._queries.append(query)
def _group_params(self):
# initialize list to collect all params
grouped_params = []
# add the option params to the list
options = self._get_options()
grouped_params.extend(options)
# add the shortcut params to the list
shortcuts = self._get_shortcuts()
grouped_params.extend(shortcuts)
return grouped_params
...
的私有QueryBuilder
方法后...
_append_query
...我现在正在多次调用valid_query = {k: v for k, v in query.items() if not k == 'seo_attr'}
if not valid_query:
return
方法,导致我的测试失败。这些是build
的额外调用:
build
我不知道如何将字典理解中的E Expected: [call({'metatag_val': 'description', 'metatag_attr': 'name'}), call({'robots': True})]
E Actual: [call({'metatag_val': 'description', 'metatag_attr': 'name'}),
E call().items(),
E call().items().__iter__(),
E call({'robots': True}),
E call().items(),
E call().items().__iter__()]
items
发送给query
再次调用build
。什么可以解释这个?