我有一个python文件a.py,其中包含两个类A和B.
class A(object):
def method_a(self):
return "Class A method a"
class B(object):
def method_b(self):
a = A()
print a.method_a()
Run Code Online (Sandbox Code Playgroud)
我想通过嘲笑method_b在课堂上B进行单元测试A.以下是testa.py用于此目的的文件内容:
import unittest
import mock
import a
class TestB(unittest.TestCase):
@mock.patch('a.A')
def test_method_b(self, mock_a):
mock_a.method_a.return_value = 'Mocked A'
b = a.B()
b.method_b()
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
我希望得到Mocked A输出.但我得到的是:
<MagicMock name='A().method_a()' id='4326621392'>
Run Code Online (Sandbox Code Playgroud)
我哪里做错了?
我正在尝试在python中进行一个简单的测试,但我无法弄清楚如何完成模拟过程.
这是类和def代码:
class FileRemoveOp(...)
@apply_defaults
def __init__(
self,
source_conn_keys,
source_conn_id='conn_default',
*args, **kwargs):
super(v4FileRemoveOperator, self).__init__(*args, **kwargs)
self.source_conn_keys = source_conn_keys
self.source_conn_id = source_conn_id
def execute (self, context)
source_conn = Connection(conn_id)
try:
for source_conn_key in self.source_keys:
if not source_conn.check_for_key(source_conn_key):
logging.info("The source key does not exist")
source_conn.remove_file(source_conn_key,'')
finally:
logging.info("Remove operation successful.")
Run Code Online (Sandbox Code Playgroud)
这是我对执行功能的测试:
@mock.patch('main.Connection')
def test_remove_execute(self,MockConn):
mock_coon = MockConn.return_value
mock_coon.value = #I'm not sure what to put here#
remove_operator = FileRemoveOp(...)
remove_operator.execute(self)
Run Code Online (Sandbox Code Playgroud)
由于execute方法尝试建立连接,我需要模拟,我不想做一个真正的连接,只是返回一些mock.我该怎么做?我习惯用Java做测试,但我从来没有在python上做过..
我正在尝试为我的烧瓶应用程序修补一个公共方法,但它似乎不起作用.
这是我的代码 mrss.feed_burner
def get_feed(env=os.environ):
return 'something'
Run Code Online (Sandbox Code Playgroud)
这就是我使用它的方式
@app.route("/feed")
def feed():
mrss_feed = get_feed(env=os.environ)
response = make_response(mrss_feed)
response.headers["Content-Type"] = "application/xml"
return response
Run Code Online (Sandbox Code Playgroud)
这是我的测试,它没有解析.
def test_feed(self):
with patch('mrss.feed_burner.get_feed', new=lambda: '<xml></xml>'):
response = self.app.get('/feed')
self.assertEquals('<xml></xml>', response.data)
Run Code Online (Sandbox Code Playgroud) 我有一个循环,我处理将记录添加到zip文件.我已经模拟了我的zipfile对象,我想提出一个异常来验证我处理大型zip文件的逻辑是否能正常工作.
有没有办法让MagicMocks或普通模拟接受第一次调用,但是在第二次调用时引发异常?
class A():
def tmp(self):
print("hi")
def b(a):
a.tmp()
Run Code Online (Sandbox Code Playgroud)
要检查是否在b中调用了tmp方法,推荐的方法是
a = A()
a.tmp = MagicMock()
b(a)
a.tmp.assert_called()
Run Code Online (Sandbox Code Playgroud)
但是这里的tmp被嘲笑了,并没有导致"hi"被打印出来。
我希望我的单元测试可以检查方法tmp是否被调用而不会模拟它。
这可能吗?
我知道在编写unitest时这不是标准的事情。但是我的用例(有点棘手)需要这样做。
我正在尝试模拟文件打开,所有示例都显示我需要
@patch('open', create=True)
Run Code Online (Sandbox Code Playgroud)
但我一直在
Need a valid target to patch. You supplied: 'open'
Run Code Online (Sandbox Code Playgroud)
我知道补丁需要完整的虚线路径open,但我不知道它是什么.事实上,我甚至不确定这是什么问题.
我在 Python 2.7 中使用 MagicMock 来模拟对象。我嘲笑的类之一具有属性,其中之一TypeError在某些情况下可以引发 a 。
我想嘲笑这种行为,但我不知道如何:
del my_mock.my_property将导致访问AttributeErrorif my_property,但我需要一个TypeError.my_mock.my_property = MagicMock(side_effect=TypeError)导致一个TypeErrorwhenmy_property被调用,但不是当它仅仅被访问时。我该怎么做?
是否可以扩展 MagicMock 类来创建模拟对象并在单元测试中使用它?
如果我在 init 函数中没有任何代码,则扩展类似乎效果很好
class MockAPI(MagicMock):
def __init__(self):
self.x = 20
def mocked_method(self, param):
return not param
class TestX(TestCase):
def setUp(self) -> None:
self.mocked_api = MockAPI()
def test_another_method(self):
self.assertTrue(True)
Run Code Online (Sandbox Code Playgroud)
但这会引发以下错误:
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 59, in testPartExecutor
yield
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 611, in run
self.setUp()
File "/Users/user/project/tests/test_protocols.py", line 46, in setUp
self.mocked_api = MockAPI()
File "/Users/user/project/tests/test_protocols.py", line 38, in __init__
self.x = 20
File "/Users/user/project/venv/lib/python3.7/site-packages/mock/mock.py", line 736, in __setattr__
elif (self._spec_set and self._mock_methods is not None and
File "/Users/user/project/venv/lib/python3.7/site-packages/mock/mock.py", …Run Code Online (Sandbox Code Playgroud) 为什么“wraps”关键字对于 MagicMock 对象的作用不一致?普通方法会传递到包装对象,但不会传递“特殊”方法。在下面的测试中,第一个断言通过,第二个断言失败。
import mock
import unittest
class Foo(object):
def bar(self):
return 1
def __len__(self):
return 3
class TestWrap(unittest.TestCase):
def test(self):
foo = Foo()
c = mock.MagicMock(wraps=foo)
assert c.bar() == 1 # Passes
assert len(c) == 3 # Fails
Run Code Online (Sandbox Code Playgroud)
我在文档中找不到任何表明这一点的内容。我错过了什么吗?
我有一个类,它使用类变量来选择要执行的逻辑。
#in file1:
class SomeHelper():
def __init__(self):
self.my_var = 0
#in file2:
import file1
class MyClass():
...
...
def calculate():
inst = file1.SomeHelper()
if x > inst.my_var:
etc etc
Run Code Online (Sandbox Code Playgroud)
我正在编写一个单元测试并在另一个文件中模拟 SomeHelper():
from file 2 import MyClass
# tried both
@patch('file2.file1') OR @patch('file2.file1.SomeHelper')
def test_calculate(self, mock_helper):
mock_helper.my_var = 0
to_test = MyClass.calculate()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
类型错误:“MagicMock”和“int”的实例之间不支持“>”。
我以为我是my_var在修补模块后定义的。
magicmock ×10
python ×10
mocking ×7
unit-testing ×5
django ×1
flask ×1
python-2.7 ×1
python-3.x ×1