Tag: python mock

嘲笑一个函数来引发Exception来testing一个except块

我有一个函数( foo )调用另一个函数( bar )。 如果调用bar()会引发一个HttpError ,如果状态码是404,我想特别处理,否则重新提升。 我试图围绕这个foo函数写一些unit testing,嘲笑bar()的调用。 不幸的是,我无法得到bar()的模拟电话来提出一个exception,这个exception被我的except块拦截。 这是我的代码,说明了我的问题: import unittest import mock from apiclient.errors import HttpError class FooTests(unittest.TestCase): @mock.patch('my_tests.bar') def test_foo_shouldReturnResultOfBar_whenBarSucceeds(self, barMock): barMock.return_value = True result = foo() self.assertTrue(result) # passes @mock.patch('my_tests.bar') def test_foo_shouldReturnNone_whenBarRaiseHttpError404(self, barMock): barMock.side_effect = HttpError(mock.Mock(return_value={'status': 404}), 'not found') result = foo() self.assertIsNone(result) # fails, test raises HttpError @mock.patch('my_tests.bar') def […]

Python从导入的模块中嘲弄一个函数

我想了解如何从一个导入的模块中@patch一个函数。 这是我到目前为止。 应用程序/ mocking.py: from app.my_module import get_user_name def test_method(): return get_user_name() if __name__ == "__main__": print "Starting Program…" test_method() 应用程序/ my_module / __ init__.py: def get_user_name(): return "Unmocked User" testing/ mock-test.py: import unittest from app.mocking import test_method def mock_get_user(): return "Mocked This Silly" @patch('app.my_module.get_user_name') class MockingTestTestCase(unittest.TestCase): def test_mock_stubs(self, mock_method): mock_method.return_value = 'Mocked This Silly') […]

Python Mock对象与多次调用的方法

我有一个类,我正在testing哪个具有作为依赖另一类(其实例传递给CUT的init方法)。 我想用Python Mock库来嘲笑这个类。 我有什么是这样的: mockobj = Mock(spec=MyDependencyClass) mockobj.methodfromdepclass.return_value = "the value I want the mock to return" assertTrue(mockobj.methodfromdepclass(42), "the value I want the mock to return") cutobj = ClassUnderTest(mockobj) 这是好的,但“methodfromdepclass”是一个参数化的方法,因此我想创build一个单一的模拟对象,其中取决于哪些parameter passing给methodfromdepclass它返回不同的值。 我想要这个参数化的行为的原因是我想要创build包含不同的值(其值从mockobj返回什么产生的)的ClassUnderTest的多个实例。 有点什么我在想(这当然是行不通的): mockobj = Mock(spec=MyDependencyClass) mockobj.methodfromdepclass.ifcalledwith(42).return_value = "you called me with arg 42" mockobj.methodfromdepclass.ifcalledwith(99).return_value = "you called me with arg 99" assertTrue(mockobj.methodfromdepclass(42), "you called […]

Python模拟多个返回值

我正在使用pythons mock.patch并想要更改每个调用的返回值。 这里是警告:被修补的函数没有input,所以我不能根据input更改返回值。 这里是我的代码供参考。 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') 我的testing代码: @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) io.prompt只是一个平台独立(python 2和3)版本的“input”。 所以最终我试图嘲笑用户的input。 我已经尝试使用返回值的列表,但是不缝合工作。 你可以看到,如果返回值是无效的,我会在这里得到一个无限循环。 所以我需要一种方法来最终改变返回值,以便我的testing实际完成。 (另一个可能的方法来回答这个问题可能是解释我怎么可以在unit testing中模仿用户input) […]

断言一个函数/方法不是使用Mock调用的

我正在使用模拟库来testing我的应用程序,但我想断言一些函数没有被调用。 模拟文档讨论像mock.assert_called_with和mock.assert_called_once_with这样的方法,但是我没有发现任何类似mock.assert_not_called或者相关的东西来validationmock 没有被调用 。 我可以像下面这样做,虽然看起来不酷,也不像pythonic: def test_something: # some actions with patch('something') as my_var: try: # args are not important. func should never be called in this test my_var.assert_called_with(some, args) except AssertionError: pass # this error being raised means it's ok # other stuff 任何想法如何做到这一点? 谢谢你的帮助 :)