gpt4 book ai didi

python - 可以迭代 MagicMock 对象吗?

转载 作者:太空宇宙 更新时间:2023-11-04 05:22:47 26 4
gpt4 key购买 nike

我想做的是这个...

x = MagicMock()
x.iter_values = [1, 2, 3]

for i in x:
i.method()

我正在尝试为此函数编写单元测试,但我不确定如何在不调用某些外部资源的情况下模拟所有调用的方法...

def wiktionary_lookup(self):
"""Looks up the word in wiktionary with urllib2, only to be used for inputting data"""
wiktionary_page = urllib2.urlopen(
"http://%s.wiktionary.org/wiki/%s" % (self.language.wiktionary_prefix, self.name))
wiktionary_page = fromstring(wiktionary_page.read())
definitions = wiktionary_page.xpath("//h3/following-sibling::ol/li")
print definitions.text_content()
defs_list = []
for i in definitions:
print i
i = i.text_content()
i = i.split('\n')
for j in i:
# Takes out an annoying "[quotations]" in the end of the string, sometimes.
j = re.sub(ur'\u2003\[quotations \u25bc\]', '', j)
if len(j) > 0:
defs_list.append(j)
return defs_list

编辑:

我不确定是否滥用了模拟。我试图在不调用外部服务的情况下对这个 wiktionary_lookup 方法进行单元测试...所以我模拟了 urlopen..我模拟了 fromstring.xpath() 但据我所知我还需要迭代xpath() 的返回值并调用方法“text_contents()”,这就是我在这里要做的。

如果我完全误解了如何对这个方法进行单元测试,那么请告诉我哪里出了问题......

编辑(添加当前单元测试代码)

@patch("lang_api.models.urllib2.urlopen")
@patch("lang_api.models.fromstring")
def test_wiktionary_lookup_2(self, fromstring, urlopen):
"""Looking up a real word in wiktionary, should return a list"""
fromstring().xpath.return_value = MagicMock(
content=["test", "test"], return_value='test\ntest2')
# A real word should give an output of definitions
output = self.things.model['word'].wiktionary_lookup()
self.assertEqual(len(output), 2)

最佳答案

您真正想要做的不是返回一个带有 return_value=[]Mock。您实际上想要返回 Mock 对象的 list。以下是包含正确组件的测试代码片段和一个小示例,用于展示如何测试循环中的迭代之一:

@patch('d.fromstring')
@patch('d.urlopen')
def test_wiktionary(self, urlopen_mock, fromstring_mock):
urlopen_mock.return_value = Mock()
urlopen_mock.return_value.read.return_value = "some_string_of_stuff"

mocked_xpath_results = [Mock()]
fromstring_mock.return_value.xpath.return_value = mocked_xpath_results

mocked_xpath_results[0].text_content.return_value = "some string"

因此,剖析上面的代码以解释为解决您的问题所做的工作:

帮助我们测试 for 循环中的代码的第一件事是创建一个模拟对象列表:

mocked_xpath_results = [Mock()]

然后,如你所见

fromstring_mock.return_value.xpath.return_value = mocked_xpath_results

我们将 xpath 调用的 return_value 设置为每个 mocked_xpath_results 的模拟列表。

作为如何在列表中执行操作的示例,我添加了如何在循环中模拟,显示为:

mocked_xpath_results[0].text_content.return_value = "some string"

在单元测试中(这可能是一个意见问题)我喜欢明确,所以我明确地访问列表项并确定应该发生什么。

希望这对您有所帮助。

关于python - 可以迭代 MagicMock 对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39783460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com