相关疑难解决方法(0)

Python模拟多个返回值

我正在使用pythons mock.patch,并希望更改每个调用的返回值.以下是警告:正在修补的函数没有输入,因此我无法根据输入更改返回值.

这是我的代码供参考.

def get_boolean_response():
    response = io.prompt('y/n').lower()
    while response not in ('y', 'n', 'yes', 'no'):
        io.echo('Not a valid input. Try again'])
        response = io.prompt('y/n').lower()

    return response in ('y', 'yes')
Run Code Online (Sandbox Code Playgroud)

我的测试代码:

@mock.patch('io')
def test_get_boolean_response(self, mock_io):
    #setup
    mock_io.prompt.return_value = ['x','y']
    result = operations.get_boolean_response()

    #test
    self.assertTrue(result)
    self.assertEqual(mock_io.prompt.call_count, 2)
Run Code Online (Sandbox Code Playgroud)

io.prompt只是一个独立于平台(python 2和3)版本的"输入".所以最终我试图模拟用户输入.我已经尝试使用列表作为返回值,但这并不能解决问题.

你可以看到,如果返回值是无效的,我将在这里得到一个无限循环.所以我需要一种方法来最终改变返回值,以便我的测试实际完成.

(回答这个问题的另一种可能的方法是解释我如何在单元测试中模仿用户输入)


不是这个问题的重复,主要是因为我没有能力改变输入.

答案中关于这个问题的评论之一是相同的,但没有提供答案/评论.

python unit-testing mocking python-mock

132
推荐指数
2
解决办法
8万
查看次数

多次更改monkeypatch setattr

我正在尝试测试依赖于第三方的代码,并希望使用 Monkeypatch 来复制我期望请求返回的内容。这是我拥有的代码的最小示例。

import requests

def get_urls(*urls):
    results = []
    for url in urls:
        results.append(requests.get(url).text)
Run Code Online (Sandbox Code Playgroud)

对于我的测试,我有如下内容:

from my_package import get_urls

def test_get_urls():
    urls = ("https://example.com/a", "https://example.com/b", "https://example.com/c")
    assert len(get_urls(urls)) == 3
Run Code Online (Sandbox Code Playgroud)

如何对每个 using 调用进行猴子requests.get补丁monkeypatch.setattr?模拟包似乎能够使用副作用来做到这一点。我如何使用 pytest 做到这一点?

python monkeypatching mocking pytest

4
推荐指数
1
解决办法
3168
查看次数