我正在使用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)版本的"输入".所以最终我试图模拟用户输入.我已经尝试使用列表作为返回值,但这并不能解决问题.
你可以看到,如果返回值是无效的,我将在这里得到一个无限循环.所以我需要一种方法来最终改变返回值,以便我的测试实际完成.
(回答这个问题的另一种可能的方法是解释我如何在单元测试中模仿用户输入)
不是这个问题的重复,主要是因为我没有能力改变输入.
答案中关于这个问题的评论之一是相同的,但没有提供答案/评论.
我们一直在使用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达成同样的目标并没有成功?
有任何想法吗?
我正在尝试测试我创建的一个函数,该函数遍历列表并调用列表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) 在unittest
我可以用值断言side_effect可迭代 - 当调用修补方法时,每个值都会一一返回,而且我发现在unittest
我的修补方法中可以根据输入参数返回不同的结果。我可以在 pytest 中做类似的事情吗?文档没有提到这一点。