相关疑难解决方法(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万
查看次数

基于输入参数模拟python函数

我们一直在使用Mock for python.

现在,我们有一种情况,我们想要模拟一个函数

def foo(self, my_param):
    #do something here, assign something to my_result
    return my_result
Run Code Online (Sandbox Code Playgroud)

通常,模拟这个的方法是(假设foo是对象的一部分)

self.foo = MagicMock(return_value="mocked!")
Run Code Online (Sandbox Code Playgroud)

甚至,如果我打电话给foo()几次我可以使用

self.foo = MagicMock(side_effect=["mocked once", "mocked twice!"])
Run Code Online (Sandbox Code Playgroud)

现在,我面临的情况是,当输入参数具有特定值时,我想返回固定值.所以如果让我们说"my_param"等于"某事"那么我想要返回"my_cool_mock"

这似乎可以在mock上用于python

when(dummy).foo("something").thenReturn("my_cool_mock")
Run Code Online (Sandbox Code Playgroud)

我一直在寻找如何与Mock达成同样的目标并没有成功?

有任何想法吗?

python unit-testing mocking mockito

126
推荐指数
7
解决办法
7万
查看次数

具有多个返回值的模拟/补丁 os.path.exists

我正在尝试测试我创建的一个函数,该函数遍历列表并调用列表os.path.exists中的每个项目。我的测试是向函数传递 2 个对象的列表。我需要os.path.exists返回True的其中之一,并False为其他。我试过这个:

import mock
import os
import unittest

class TestClass(unittest.TestCase):
    values = {1 : True, 2 : False}
    def side_effect(arg):
        return values[arg]

    def testFunction(self):
        with mock.patch('os.path.exists') as m:
            m.return_value = side_effect # 1
            m.side_effect = side_effect # 2

            arglist = [1, 2]
            ret = test(argList)
Run Code Online (Sandbox Code Playgroud)

使用第 1 行和第 2 行中的任何一个但不是同时使用 NameError: global name 'side_effect' is not defined

我发现了这个问题并像这样修改了我的代码:

import mock
import os

class TestClass(unittest.TestCase):
    values = {1 : True, …
Run Code Online (Sandbox Code Playgroud)

python mocking python-2.7 python-unittest

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

pytest Monkeypatch:每次调用修补方法时是否有可能返回不同的值?

unittest我可以用值断言side_effect可迭代 - 当调用修补方法时,每个值都会一一返回,而且我发现unittest我的修补方法中可以根据输入参数返回不同的结果。我可以在 pytest 中做类似的事情吗?文档没有提到这一点。

python unit-testing pytest python-unittest

3
推荐指数
1
解决办法
3361
查看次数