Mocked方法声称它有比预期更多的呼叫

时间:2016-11-16 21:54:24

标签: python testing mocking

我有一个类QueryBuilder,它将消息build发送到另一个类Query的实例。发送该消息的方法称为build_query。出于此问题的目的,我只关注QueryBuilderQuery的{​​{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。什么可以解释这个?

0 个答案:

没有答案